<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[12322] CalendarServer/branches/users/gaya/cleanrevisions</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.calendarserver.org//changeset/12322">12322</a></dd>
<dt>Author</dt> <dd>gaya@apple.com</dd>
<dt>Date</dt> <dd>2014-01-12 11:10:08 -0800 (Sun, 12 Jan 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>merge from trunk through <a href="http://trac.calendarserver.org//changeset/12321">r12321</a></pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsREADME">CalendarServer/branches/users/gaya/cleanrevisions/README</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbenchmark">CalendarServer/branches/users/gaya/cleanrevisions/benchmark</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbenchreport">CalendarServer/branches/users/gaya/cleanrevisions/benchreport</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbin_calendarserver_preamblepy">CalendarServer/branches/users/gaya/cleanrevisions/bin/_calendarserver_preamble.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincaldavd">CalendarServer/branches/users/gaya/cleanrevisions/bin/caldavd</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_backup">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_backup</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_bootstrap_database">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_bootstrap_database</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_command_gateway">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_command_gateway</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_config">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_config</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_dbinspect">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_dbinspect</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_dkimtool">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_dkimtool</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_export">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_export</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_icalendar_validate">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_icalendar_validate</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_load_augmentdb">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_load_augmentdb</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_manage_postgres">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_manage_postgres</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_manage_principals">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_manage_principals</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_manage_push">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_manage_push</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_manage_timezones">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_manage_timezones</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_migrate_resources">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_migrate_resources</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_monitor_amp_notifications">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_monitor_amp_notifications</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_monitor_notifications">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_monitor_notifications</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_monitor_work">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_monitor_work</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_purge_attachments">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_purge_attachments</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_purge_events">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_purge_events</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_purge_principals">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_purge_principals</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_shell">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_shell</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_upgrade">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_upgrade</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_verify_data">CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_verify_data</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbinicalendar_split">CalendarServer/branches/users/gaya/cleanrevisions/bin/icalendar_split</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbinproxyclean">CalendarServer/branches/users/gaya/cleanrevisions/bin/proxyclean</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbintrial">CalendarServer/branches/users/gaya/cleanrevisions/bin/trial</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsbintwistd">CalendarServer/branches/users/gaya/cleanrevisions/bin/twistd</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserver__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserveraccesslogpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/accesslog.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservercontrolsocketpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/controlsocket.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverlogAnalysispy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/logAnalysis.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverplatform__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwin__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwin_saclc">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/_sacl.c</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwinod__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwinoddsattributespy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/dsattributes.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwinoddsquerypy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/dsquery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwinodopendirectorypy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/opendirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwinodsetup_directorypy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/setup_directory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwinodsetup_testuserspy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/setup_testusers.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwinodtest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwinodtesttest_opendirectorypy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/test/test_opendirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwinwikipy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/wiki.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverprovision__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/provision/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverprovisionrootpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/provision/root.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverprovisiontest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/provision/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverprovisiontesttest_rootpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/provision/test/test_root.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverpush__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverpushamppushpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/amppush.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverpushapplepushpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/applepush.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverpushnotifierpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/notifier.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverpushtest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverpushtesttest_amppushpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/test/test_amppush.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverpushtesttest_applepushpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/test/test_applepush.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverpushtesttest_notifierpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/test/test_notifier.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverpushutilpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertap__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertapcaldavpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/caldav.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertapcfgchildpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/cfgchild.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertapprofilingpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/profiling.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertaptest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertaptestlonglinespy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/test/longlines.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertaptesttest_caldavpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/test/test_caldav.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertaptesttest_utilpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/test/test_util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertaputilpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertesttest_logAnalysispy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/test/test_logAnalysis.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertools__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsagentpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/agent.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsampnotificationspy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/ampnotifications.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsanonymizepy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/anonymize.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsbackuppy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/backup.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsbackup_pgpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/backup_pg.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsbootstrapdatabasepy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/bootstrapdatabase.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolscalverifypy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/calverify.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolscalverify_diffpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/calverify_diff.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolschangeip_calendarpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/changeip_calendar.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolscmdlinepy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/cmdline.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsconfigpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/config.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsdbinspectpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/dbinspect.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsdkimtoolpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/dkimtool.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsexportpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/export.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsgatewaypy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/gateway.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsicalsplitpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/icalsplit.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsloadaugmentdbpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/loadaugmentdb.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsmanagepostgrespy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/managepostgres.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsmanagetimezonespy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/managetimezones.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsmigratepy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/migrate.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsmigrate_verifypy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/migrate_verify.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsnotificationspy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/notifications.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsobliteratepy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/obliterate.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsprincipalspy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/principals.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolspurgepy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/purge.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolspushpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/push.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsresourcespy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/resources.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsshell__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsshellcmdpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/cmd.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsshelldirectorypy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/directory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsshellterminalpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/terminal.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsshelltest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsshelltesttest_cmdpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/test/test_cmd.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsshelltesttest_vfspy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/test/test_vfs.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsshellvfspy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/vfs.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstablespy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/tables.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestcalverifyaccountsxml">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/calverify/accounts.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestcalverifyaugmentsxml">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/calverify/augments.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestdeprovisionaugmentsxml">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/deprovision/augments.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestdeprovisioncaldavdplist">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/deprovision/caldavd.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestdeprovisionresourceslocationsxml">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/deprovision/resources-locations.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestdeprovisionusersgroupsxml">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/deprovision/users-groups.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestgatewayaugmentsxml">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/gateway/augments.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestgatewaycaldavdplist">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/gateway/caldavd.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestgatewayresourceslocationsxml">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/gateway/resources-locations.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestgatewayusersgroupsxml">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/gateway/users-groups.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestprincipalsaugmentsxml">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/principals/augments.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestprincipalscaldavdplist">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/principals/caldavd.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestprincipalsresourceslocationsxml">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/principals/resources-locations.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestprincipalsusersgroupsxml">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/principals/users-groups.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestpurgeaccountsxml">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/purge/accounts.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_agentpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_agent.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_calverifypy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_calverify.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_changeippy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_changeip.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_configpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_config.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_exportpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_export.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_gatewaypy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_gateway.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_principalspy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_principals.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_purgepy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_purge.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_purge_old_eventspy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_purge_old_events.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_resourcespy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_resources.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_utilpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsupgradepy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/upgrade.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsutilpy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsvalidcalendardatapy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/validcalendardata.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsworkitemspy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/workitems.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverwebadmin__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webadmin/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverwebadminresourcepy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webadmin/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverwebadmintest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webadmin/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverwebadmintesttest_resourcepy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webadmin/test/test_resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverwebcal__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webcal/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverwebcalresourcepy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webcal/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverwebcaltest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webcal/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscalendarserverwebcaltesttest_resourcepy">CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webcal/test/test_resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfauthaccountstestxml">CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/accounts-test.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfauthaccountsdtd">CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/accounts.dtd</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfauthaccountsxml">CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/accounts.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfauthaugmentsdefaultxml">CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/augments-default.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfauthaugmentsdtd">CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/augments.dtd</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfauthproxiestestpodxml">CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/proxies-test-pod.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfauthproxiestestxml">CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/proxies-test.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfauthproxiesdtd">CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/proxies.dtd</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfcaldavdappleplist">CalendarServer/branches/users/gaya/cleanrevisions/conf/caldavd-apple.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfcaldavdtestpodBplist">CalendarServer/branches/users/gaya/cleanrevisions/conf/caldavd-test-podB.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfcaldavdtestplist">CalendarServer/branches/users/gaya/cleanrevisions/conf/caldavd-test.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfcaldavdplist">CalendarServer/branches/users/gaya/cleanrevisions/conf/caldavd.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconflocalserverstestxml">CalendarServer/branches/users/gaya/cleanrevisions/conf/localservers-test.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconflocalserversdtd">CalendarServer/branches/users/gaya/cleanrevisions/conf/localservers.dtd</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconflocalserversxml">CalendarServer/branches/users/gaya/cleanrevisions/conf/localservers.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfremoteserverstestxml">CalendarServer/branches/users/gaya/cleanrevisions/conf/remoteservers-test.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfremoteserversdtd">CalendarServer/branches/users/gaya/cleanrevisions/conf/remoteservers.dtd</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfremoteserversxml">CalendarServer/branches/users/gaya/cleanrevisions/conf/remoteservers.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfresourcescaldavdresourcesplist">CalendarServer/branches/users/gaya/cleanrevisions/conf/resources/caldavd-resources.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfresourceslocationsresourcesorigxml">CalendarServer/branches/users/gaya/cleanrevisions/conf/resources/locations-resources-orig.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfresourceslocationsresourcesxml">CalendarServer/branches/users/gaya/cleanrevisions/conf/resources/locations-resources.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfresourcesusersgroupsxml">CalendarServer/branches/users/gaya/cleanrevisions/conf/resources/users-groups.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconfresourcesxml">CalendarServer/branches/users/gaya/cleanrevisions/conf/resources.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsconftestaccountsxml">CalendarServer/branches/users/gaya/cleanrevisions/conf/test/accounts.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontrib__init__py">CalendarServer/branches/users/gaya/cleanrevisions/contrib/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontriblaunchdcalendarserverplist">CalendarServer/branches/users/gaya/cleanrevisions/contrib/launchd/calendarserver.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformance__init__py">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformance_event_changepy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/_event_change.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformance_event_createpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/_event_create.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchlibpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchlib.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchlibsh">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchlib.sh</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmark">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmark</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarkpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmark.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksbounded_recurrencepy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/bounded_recurrence.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksbounded_recurrence_autoacceptpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/bounded_recurrence_autoaccept.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarkseventpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksevent_add_attendeepy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_add_attendee.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksevent_autoacceptpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_autoaccept.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksevent_change_datepy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_change_date.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksevent_change_summarypy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_change_summary.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksevent_deletepy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_delete.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksevent_delete_attendeepy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_delete_attendee.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksevent_movepy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_move.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksfind_calendarspy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/find_calendars.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksfind_eventspy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/find_events.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksunbounded_recurrencepy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/unbounded_recurrence.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksunbounded_recurrence_autoacceptpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/unbounded_recurrence_autoaccept.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksvfreebusypy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/vfreebusy.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksvfreebusy_vary_attendeespy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/vfreebusy_vary_attendees.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancecompare">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/compare</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancecomparepy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/compare.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancedisplaycalendareventspy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/display-calendar-events.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceextractconf">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/extractconf</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancefixunitssql">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/fix-units.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancegraph">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/graph</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancegraphpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/graph.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancehttpauthpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/httpauth.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancehttpclientpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/httpclient.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceio_measured">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/io_measure.d</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtestampsimpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/ampsim.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtestclientsplist">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/clients.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtestconfigdistplist">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/config.dist.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtestconfigplist">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/config.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtesticalpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/ical.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtestloggerpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/logger.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtestpopulationpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/population.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtestprofilespy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/profiles.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtestsimpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/sim.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtesttest_icalpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_ical.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtesttest_populationpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_population.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtesttest_profilespy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_profiles.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtesttest_simpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_sim.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtesttest_trafficloggerpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_trafficlogger.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtesttest_webadminpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_webadmin.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtesttrafficloggerpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/trafficlogger.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtestwebadminpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/webadmin.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancemassupload">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/massupload</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancemassuploadpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/massupload.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancenightlysh">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/nightly.sh</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancepgsqld">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/pgsql.d</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceprofilesh">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/profile.sh</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancereport">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/report</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancereportpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/report.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancereport_principalspy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/report_principals.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancereuploadsh">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/reupload.sh</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesamplemanysh">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sample-many.sh</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesamplesh">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sample.sh</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesetbackend">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/setbackend</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesetbackendpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/setbackend.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesim">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sim</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesomemoredatash">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/some-more-data.sh</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancespeedcentertac">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/speedcenter.tac</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesql_measured">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sql_measure.d</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusage__init__py">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagerequests__init__py">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagerequestshttpTestspy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/httpTests.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagerequestsinvitepy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/invite.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagerequestsmultigetpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/multiget.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagerequestspropfindpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/propfind.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagerequestspropfind_invitepy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/propfind_invite.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagerequestsputpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/put.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagerequestsquerypy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/query.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagerequestssyncpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/sync.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagesqlusagepy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/sqlusage.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlwatch">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlwatch</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlwatchpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlwatch.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancestackedbarpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/stackedbar.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancestatspy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/stats.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesudorunsh">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sudo-run.sh</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesvncommittime">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/svn-committime</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancesvnrevno">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/svn-revno</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancetest_benchmarkpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/test_benchmark.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancetest_event_change_datepy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/test_event_change_date.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancetest_httpauthpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/test_httpauth.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformancetest_statspy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/test_stats.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceupload">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/upload</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribperformanceuploadpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/upload.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribtoolsanonymous_logpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/anonymous_log.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribtoolsdtraceanalyzepy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/dtraceanalyze.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribtoolsfakecalendardatapy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/fakecalendardata.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribtoolsfix_calendar">CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/fix_calendar</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribtoolsharpoonpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/harpoon.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribtoolsmonitoranalysispy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/monitoranalysis.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribtoolsmonitorsplitpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/monitorsplit.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribtoolsnetstatuspy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/netstatus.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribtoolspg_stats_analysispy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/pg_stats_analysis.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribtoolspgtraced">CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/pgtrace.d</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribtoolsprotocolanalysispy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/protocolanalysis.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribtoolsreadStatspy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/readStats.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribtoolsrequest_monitorpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/request_monitor.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribtoolssortrecurrencespy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/sortrecurrences.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribtoolssqldata_from_pathpy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/sqldata_from_path.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribtoolstablespy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/tables.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribtoolstest_protocolanalysispy">CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/test_protocolanalysis.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribwebpollMakefile">CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/Makefile</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribwebpollwebappjscaldavjs">CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/webapp/js/caldav.js</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribwebpollwebappjsjcaljs">CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/webapp/js/jcal.js</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribwebpollwebappjsutilsjs">CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/webapp/js/utils.js</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionscontribwebpollwebappjswebpolljs">CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/webapp/js/webpoll.js</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsdoccaldavd8">CalendarServer/branches/users/gaya/cleanrevisions/doc/caldavd.8</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_bootstrap_database8">CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_bootstrap_database.8</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_command_gateway8">CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_command_gateway.8</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_config8">CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_config.8</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_export8">CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_export.8</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_manage_principals8">CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_manage_principals.8</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_manage_push8">CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_manage_push.8</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_manage_timezones8">CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_manage_timezones.8</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_migrate_resources8">CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_migrate_resources.8</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_monitor_notifications8">CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_monitor_notifications.8</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_purge_attachments8">CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_purge_attachments.8</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_purge_events8">CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_purge_events.8</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_purge_principals8">CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_purge_principals.8</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_shell8">CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_shell.8</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionslocalesen_ENISO88591LC_MESSAGEScalendarserverpo">CalendarServer/branches/users/gaya/cleanrevisions/locales/en_EN.ISO8859-1/LC_MESSAGES/calendarserver.po</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionspydoctor">CalendarServer/branches/users/gaya/cleanrevisions/pydoctor</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsrun">CalendarServer/branches/users/gaya/cleanrevisions/run</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionssetuppy">CalendarServer/branches/users/gaya/cleanrevisions/setup.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionssim">CalendarServer/branches/users/gaya/cleanrevisions/sim</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionssupportApplemake">CalendarServer/branches/users/gaya/cleanrevisions/support/Apple.make</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionssupportXCodemake">CalendarServer/branches/users/gaya/cleanrevisions/support/XCode.make</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionssupportbuildsh">CalendarServer/branches/users/gaya/cleanrevisions/support/build.sh</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionssupportgendocs">CalendarServer/branches/users/gaya/cleanrevisions/support/gendocs</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionssupportpatchapply">CalendarServer/branches/users/gaya/cleanrevisions/support/patchapply</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionssupportpatchmaker">CalendarServer/branches/users/gaya/cleanrevisions/support/patchmaker</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionssupportpysh">CalendarServer/branches/users/gaya/cleanrevisions/support/py.sh</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionssupportshellsh">CalendarServer/branches/users/gaya/cleanrevisions/support/shell.sh</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionssupportsubmit">CalendarServer/branches/users/gaya/cleanrevisions/support/submit</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionssupportversionpy">CalendarServer/branches/users/gaya/cleanrevisions/support/version.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstest">CalendarServer/branches/users/gaya/cleanrevisions/test</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstestserver">CalendarServer/branches/users/gaya/cleanrevisions/testserver</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedpluginscaldavpy">CalendarServer/branches/users/gaya/cleanrevisions/twisted/plugins/caldav.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldav__init__py">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavaccountingpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/accounting.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavauthkerbpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/authkerb.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavbackuppy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/backup.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavbindpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/bind.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavcachepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/cache.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavcaldavxmlpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/caldavxml.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavcarddavxmlpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/carddavxml.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavclient__init__py">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavclientgeturlpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/geturl.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavclientpoolpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/pool.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavclientreverseproxypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/reverseproxy.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavclienttest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavclienttesttest_reverseproxypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/test/test_reverseproxy.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavconfigpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/config.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavcustomxmlpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/customxml.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatabasepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/database.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafilters__init__py">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafiltersaddressdatapy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/addressdata.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafilterscalendardatapy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/calendardata.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafiltersfilterpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/filter.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafiltershiddeninstancepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/hiddeninstance.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafiltersperuserdatapy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/peruserdata.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafiltersprivateeventspy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/privateevents.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafilterstest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafilterstesttest_calendardatapy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/test_calendardata.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafilterstesttest_hiddeninstancespy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/test_hiddeninstances.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafilterstesttest_peruserdatapy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/test_peruserdata.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafilterstesttest_privateeventspy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/test_privateevents.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdateopspy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/dateops.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectory__init__py">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryaddressbookpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/addressbook.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryaggregatepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/aggregate.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryappleopendirectorypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/appleopendirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryaugmentpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/augment.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorycachingdirectorypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/cachingdirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorycalendarpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/calendar.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorycalendaruserproxypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/calendaruserproxy.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorycalendaruserproxyloaderpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/calendaruserproxyloader.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorycommonpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/common.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorydigestpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/digest.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorydirectorypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/directory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryidirectorypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/idirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryinternalpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/internal.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryldapdirectorypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/ldapdirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryopendirectorybackerpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/opendirectorybacker.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryprincipalpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/principal.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryresourcepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryresourceinfopy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/resourceinfo.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestaccountsmodifiedxml">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/accounts-modified.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestaccountsxml">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/accounts.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestaugmentsnormalizationxml">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/augments-normalization.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestaugmentstestdefaultxml">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/augments-test-default.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestaugmentstestxml">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/augments-test.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestaugmentsxml">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/augments.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestmodifyaugmentsxml">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/modify/augments.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestmodifyresourceslocationsxml">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/modify/resources-locations.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestmodifyusersgroupsxml">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/modify/users-groups.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestproxiesxml">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/proxies.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestresourcesaugmentsxml">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources/augments.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestresourcescaldavdplist">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources/caldavd.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestresourcesresourceslocationsxml">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources/resources-locations.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestresourcesusersgroupsxml">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources/users-groups.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestresourcesxml">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_aggregatepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_aggregate.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_augmentpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_augment.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_buildquerypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_buildquery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_cachedirectorypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_cachedirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_calendarpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_calendar.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_digestpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_digest.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_directorypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_directory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_guidchangepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_guidchange.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_ldapdirectorypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_ldapdirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_livedirectorypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_livedirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_modifypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_modify.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_opendirectorypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_opendirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_opendirectorybackerpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_opendirectorybacker.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_principalpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_principal.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_proxyprincipaldbpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_proxyprincipaldb.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_proxyprincipalmemberspy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_proxyprincipalmembers.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_resourcespy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_resources.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_utilpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_wikipy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_wiki.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_xmlfilepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_xmlfile.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestutilpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryutilpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorywikipy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/wiki.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryxmlaccountsparserpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/xmlaccountsparser.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryxmlaugmentsparserpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/xmlaugmentsparser.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryxmlfilepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/xmlfile.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorybackedaddressbookpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directorybackedaddressbook.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdropboxpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/dropbox.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavextensionspy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/extensions.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavfreebusyurlpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/freebusyurl.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavicalpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/ical.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavicaldavpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/icaldav.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavinstancepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/instance.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavlinkresourcepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/linkresource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavlocalizationpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/localization.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmemcachelockpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/memcachelock.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmemcachepoolpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/memcachepool.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmemcachepropspy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/memcacheprops.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmemcacherpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/memcacher.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethod__init__py">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodaclpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/acl.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodgetpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/get.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodmkcalendarpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/mkcalendar.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodmkcolpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/mkcol.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodpostpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/post.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodpropfindpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/propfind.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodreportpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodreport_addressbook_multigetpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_addressbook_multiget.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodreport_addressbook_querypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_addressbook_query.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodreport_calendar_multigetpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_calendar_multiget.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodreport_calendar_querypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_calendar_query.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodreport_commonpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_common.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodreport_freebusypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_freebusy.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodreport_multiget_commonpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_multiget_common.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodreport_sync_collectionpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_sync_collection.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmkcolxmlpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/mkcolxml.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavnotificationspy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/notifications.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavresourcepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavscheduling_store__init__py">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavscheduling_storecaldav__init__py">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/caldav/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavscheduling_storecaldavresourcepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/caldav/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavscheduling_storecaldavtest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/caldav/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavscheduling_storecaldavtesttest_resourcepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/caldav/test/test_resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavsharingpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/sharing.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavsimpleresourcepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/simpleresource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavsqlpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/sql.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavstdconfigpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/stdconfig.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavstorebridgepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/storebridge.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_accountingpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_accounting.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_addressbookmultigetpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_addressbookmultiget.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_addressbookquerypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_addressbookquery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_cachepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_cache.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_caldavxmlpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_caldavxml.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_calendarquerypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_calendarquery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_collectioncontentspy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_collectioncontents.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_configpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_config.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_customxmlpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_customxml.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_databasepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_database.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_dateopspy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_dateops.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_extensionspy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_extensions.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_freebusyquerypy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_freebusyquery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_icalendarpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_icalendar.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_kerberospy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_kerberos.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_linkpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_link.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_localizationpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_localization.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_memcachepoolpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_memcachepool.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_memcachepropspy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_memcacheprops.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_mkcalendarpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_mkcalendar.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_multigetpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_multiget.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_optionspy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_options.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_propspy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_props.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_resourcepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_sharingpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_sharing.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_sqlpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_sql.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_stdconfigpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_stdconfig.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_timezonespy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_timezones.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_timezonestdservicepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_timezonestdservice.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_upgradepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_upgrade.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_utilpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_wrappingpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_wrapping.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_xmlpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_xml.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_xmlutilpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_xmlutil.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtestutilpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtimezonespy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/timezones.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtimezoneservicepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/timezoneservice.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtimezonestdservicepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/timezonestdservice.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtimezonexmlpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/timezonexml.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavupgradepy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/upgrade.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavutilpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavvcardpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/vcard.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstwistedcaldavxmlutilpy">CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/xmlutil.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdav__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbase__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasedatastore__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasedatastoredbapiclientpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/dbapiclient.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasedatastorefilepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasedatastoresubpostgrespy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/subpostgres.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasedatastoretest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasedatastoretesttest_subpostgrespy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/test/test_subpostgres.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasedatastoreutilpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystore__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystoreappledouble_xattrpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/appledouble_xattr.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystorebasepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/base.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystorenonepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/none.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystoresqlpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/sql.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystoretest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystoretestbasepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/base.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystoretesttest_appledoublepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_appledouble.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystoretesttest_basepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_base.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystoretesttest_nonepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_none.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystoretesttest_sqlpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_sql.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystoretesttest_xattrpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_xattr.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystorexattrpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/xattr.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldav__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastore__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastorefilepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreindex_filepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/index_file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/schedule.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastorescheduling__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingaddressmappingpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/addressmapping.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingcaldav__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingcaldavdeliverypy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/delivery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingcaldavschedulerpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/scheduler.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingcaldavtest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingcaldavtesttest_deliverypy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/test/test_delivery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingcaldavtesttest_schedulerpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/test/test_scheduler.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingcuaddresspy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/cuaddress.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingdeliverypy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/delivery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingfreebusypy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/freebusy.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingicaldiffpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/icaldiff.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingicalsplitterpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/icalsplitter.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimip__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimipdeliverypy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/delivery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimipinboundpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/inbound.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimipmailgatewaypy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/mailgateway.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimipoutboundpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/outbound.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimipschedulerpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/scheduler.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimipsmtpsenderpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/smtpsender.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimiptest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimiptesttest_deliverypy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/test_delivery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimiptesttest_inboundpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/test_inbound.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimiptesttest_mailgatewaypy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/test_mailgateway.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimiptesttest_outboundpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/test_outbound.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimplicitpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/implicit.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischedule__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduledeliverypy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/delivery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduledkimpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/dkim.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischedulelocalserverspy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/localservers.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduleremoteserverspy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/remoteservers.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduleresourcepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduleschedulerpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/scheduler.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduletest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduletesttest_deliverypy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_delivery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduletesttest_dkimpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_dkim.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduletesttest_localserverspy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduletesttest_remoteserverspy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_remoteservers.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduletesttest_resourcepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduletesttest_utilspy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_utils.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduleutilspy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/utils.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischedulexmlpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/xml.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingitippy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/itip.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingprocessingpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/processing.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingschedulerpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/scheduler.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingtest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingtesttest_freebusypy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_freebusy.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingtesttest_icaldiffpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_icaldiff.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingtesttest_icalsplitterpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_icalsplitter.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingtesttest_implicitpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_implicit.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingtesttest_itippy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_itip.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingtesttest_pocessingpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_pocessing.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingtesttest_utilspy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_utils.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingutilspy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/utils.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoresqlpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/sql.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretestattachmentsaccountsxml">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/attachments/accounts.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretestcommonpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/common.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretesttest_attachmentspy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_attachments.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretesttest_filepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretesttest_implicitpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_implicit.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretesttest_index_filepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_index_file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretesttest_schedulepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_schedule.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretesttest_sqlpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_sql.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretesttest_sql_sharingpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_sql_sharing.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretesttest_utilpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretestutilpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreutilpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavicalendardirectoryservicepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/icalendardirectoryservice.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavicalendarstorepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/icalendarstore.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavresourcepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcarddav__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastore__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastorefilepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoreindex_filepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/index_file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoresqlpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/sql.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoretest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoretestcommonpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/common.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoretesttest_filepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/test_file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoretesttest_index_filepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/test_index_file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoretesttest_sqlpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/test_sql.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoretesttest_sql_sharingpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/test_sql_sharing.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoreutilpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcarddaviaddressbookstorepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/iaddressbookstore.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcarddavresourcepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommon__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastore__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastorecommonpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/common.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastorefilepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresqlpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_dumppy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_dump.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemacurrentoracledialectsql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/current-oracle-dialect.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemacurrentsql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/current.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldoracledialectv27sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v27.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldoracledialectv28sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v28.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldoracledialectv29sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v29.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldoracledialectv30sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v30.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldoracledialectv31sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v31.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldoracledialectv32sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v32.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv10sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v10.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv11sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v11.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv12sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v12.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv13sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v13.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv14sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v14.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv15sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v15.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv16sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v16.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv17sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v17.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv18sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v18.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv19sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v19.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv20sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v20.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv21sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v21.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv22sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v22.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv23sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v23.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv24sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v24.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv25sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v25.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv26sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v26.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv27sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v27.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv28sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v28.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv29sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v29.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv3sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v3.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv30sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v30.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv31sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v31.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv32sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v32.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv4sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v4.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv5sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v5.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv6sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v6.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv7sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v7.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv8sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v8.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv9sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v9.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_10_to_11sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_10_to_11.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_11_to_12sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_11_to_12.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_12_to_13sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_12_to_13.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_13_to_14sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_13_to_14.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_14_to_15sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_14_to_15.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_15_to_16sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_15_to_16.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_16_to_17sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_16_to_17.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_17_to_18sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_17_to_18.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_18_to_19sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_18_to_19.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_19_to_20sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_19_to_20.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_20_to_21sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_20_to_21.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_21_to_22sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_21_to_22.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_22_to_23sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_22_to_23.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_23_to_24sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_23_to_24.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_24_to_25sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_24_to_25.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_25_to_26sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_25_to_26.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_26_to_27sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_26_to_27.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_27_to_28sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_27_to_28.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_28_to_29sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_28_to_29.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_29_to_30sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_29_to_30.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_30_to_31sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_30_to_31.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_31_to_32sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_31_to_32.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_3_to_4sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_3_to_4.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_4_to_5sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_4_to_5.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_5_to_6sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_5_to_6.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_6_to_7sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_6_to_7.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_7_to_8sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_7_to_8.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_8_to_9sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_8_to_9.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_9_to_10sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_9_to_10.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_10_to_11sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_10_to_11.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_11_to_12sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_11_to_12.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_12_to_13sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_12_to_13.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_13_to_14sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_13_to_14.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_14_to_15sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_14_to_15.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_15_to_16sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_15_to_16.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_16_to_17sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_16_to_17.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_17_to_18sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_17_to_18.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_18_to_19sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_18_to_19.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_19_to_20sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_19_to_20.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_20_to_21sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_20_to_21.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_21_to_22sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_21_to_22.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_22_to_23sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_22_to_23.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_23_to_24sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_23_to_24.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_24_to_25sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_24_to_25.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_25_to_26sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_25_to_26.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_26_to_27sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_26_to_27.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_27_to_28sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_27_to_28.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_28_to_29sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_28_to_29.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_29_to_30sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_29_to_30.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_30_to_31sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_30_to_31.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_31_to_32sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_31_to_32.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_3_to_4sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_3_to_4.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_4_to_5sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_4_to_5.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_5_to_6sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_5_to_6.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_6_to_7sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_6_to_7.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_7_to_8sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_7_to_8.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_8_to_9sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_8_to_9.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_9_to_10sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_9_to_10.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesupgrade_templatesql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/upgrade_template.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_tablespy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_tables.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoretest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoretesttest_sqlpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/test_sql.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoretesttest_sql_schema_filespy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/test_sql_schema_files.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoretesttest_sql_tablespy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/test_sql_tables.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoretestutilpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgrade__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradefile__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/file/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgrademigratepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/migrate.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesql__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlothers__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/others/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlothersattachment_migrationpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/others/attachment_migration.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlotherstest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/others/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlotherstesttest_attachment_migrationpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/others/test/test_attachment_migration.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltestfake_schema1currentsql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema1/current.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltestfake_schema1upgradesfake_dialectupgrade_from_3_to_4sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema1/upgrades/fake_dialect/upgrade_from_3_to_4.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltestfake_schema2currentsql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema2/current.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltestfake_schema2upgradesfake_dialectupgrade_from_3_to_4sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema2/upgrades/fake_dialect/upgrade_from_3_to_4.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltestfake_schema2upgradesfake_dialectupgrade_from_3_to_5sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema2/upgrades/fake_dialect/upgrade_from_3_to_5.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltestfake_schema2upgradesfake_dialectupgrade_from_4_to_5sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema2/upgrades/fake_dialect/upgrade_from_4_to_5.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltestfake_schema3currentsql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema3/current.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltestfake_schema3upgradesfake_dialectupgrade_from_3_to_4sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema3/upgrades/fake_dialect/upgrade_from_3_to_4.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltestfake_schema3upgradesfake_dialectupgrade_from_4_to_5sql">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema3/upgrades/fake_dialect/upgrade_from_4_to_5.sql</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltesttest_upgradepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/test_upgrade.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrade.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgrades__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradesaddressbook_upgrade_from_1_to_2py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/addressbook_upgrade_from_1_to_2.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradescalendar_upgrade_from_1_to_2py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_1_to_2.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradescalendar_upgrade_from_2_to_3py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_2_to_3.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradescalendar_upgrade_from_3_to_4py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_3_to_4.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradescalendar_upgrade_from_4_to_5py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_4_to_5.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradesnotification_upgrade_from_0_to_1py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/notification_upgrade_from_0_to_1.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradestest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradestesttest_notification_upgrade_from_0_to_1py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/test/test_notification_upgrade_from_0_to_1.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradestesttest_upgrade_from_3_to_4py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/test/test_upgrade_from_3_to_4.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradestesttest_upgrade_from_4_to_5py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/test/test_upgrade_from_4_to_5.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradesutilpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradetest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradetesttest_migratepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/test/test_migrate.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreworktesttest_revision_cleanuppy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/work/test/test_revision_cleanup.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommonicommondatastorepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/icommondatastore.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommonidirectoryservicepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/idirectoryservice.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommoninotificationspy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/inotifications.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavidavpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/idav.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxml__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmlbasepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/base.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmlelementpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/element.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmlextensionspy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/extensions.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmlparserpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/parser.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmlparser_basepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/parser_base.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmlparser_etreepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/parser_etree.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmlparser_saxpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/parser_sax.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmlrfc2518py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc2518.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmlrfc3253py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc3253.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmlrfc3744py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc3744.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmlrfc4331py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc4331.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmlrfc5397py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc5397.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmlrfc5842py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc5842.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmlrfc5995py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc5995.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmlrfc6578py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc6578.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmltest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmltesttest_basepy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/test/test_base.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmltesttest_xmlpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/test/test_xml.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavxmltesttest_xml_rfc3744py">CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/test/test_xml_rfc3744.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2auth__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2authbasicpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/basic.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2authdigestpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/digest.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2authinterfacespy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/interfaces.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2authwrapperpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/wrapper.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2channel__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/channel/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2channelhttppy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/channel/http.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2client__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/client/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2clienthttppy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/client/http.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2clientinterfacespy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/client/interfaces.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2dav__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davauthpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/auth.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davfileoppy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/fileop.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davhttppy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/http.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davidavpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/idav.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davmethod__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodaclpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/acl.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodcopymovepy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/copymove.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davmethoddeletepy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/delete.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davmethoddelete_commonpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/delete_common.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodgetpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/get.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodlockpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/lock.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodmkcolpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/mkcol.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodpropfindpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/propfind.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodproppatchpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/proppatch.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodputpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/put.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodput_commonpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/put_common.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodreportpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodreport_acl_principal_prop_setpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_acl_principal_prop_set.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodreport_expandpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_expand.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodreport_principal_matchpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_principal_match.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodreport_principal_property_searchpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_principal_property_search.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodreport_principal_search_property_setpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_principal_search_property_set.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davnonepropspy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/noneprops.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davresourcepy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davstaticpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/static.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtest__init__py">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_aclpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_acl.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_authpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_auth.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_copypy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_copy.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_deletepy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_delete.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_httppy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_http.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_lockpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_lock.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_mkcolpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_mkcol.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_movepy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_move.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_optionspy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_options.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_pipelinepy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_pipeline.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_proppy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_prop.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_putpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_put.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_quotapy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_quota.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_reportpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_report.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_report_expandpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_report_expand.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_resourcepy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_staticpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_static.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_utilpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davtestutilpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davutilpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2davxattrpropspy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/xattrprops.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2errorpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/error.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2fileuploadpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/fileupload.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2httppy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/http.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2http_headerspy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/http_headers.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2iwebpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/iweb.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2logpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/log.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2metafdpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/metafd.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2resourcepy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2responsecodepy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/responsecode.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2serverpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/server.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2staticpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/static.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2streampy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/stream.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxweb2testtest_metafdpy">CalendarServer/branches/users/gaya/cleanrevisions/txweb2/test/test_metafd.py</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsdocExtensionscaldavrecursplittxt">CalendarServer/branches/users/gaya/cleanrevisions/doc/Extensions/caldav-recursplit.txt</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionsdocExtensionscaldavrecursplitxml">CalendarServer/branches/users/gaya/cleanrevisions/doc/Extensions/caldav-recursplit.xml</a></li>
<li>CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/query/</li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoresql_externalpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/sql_external.py</a></li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretesttest_sql_externalpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_sql_external.py</a></li>
<li>CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/query/</li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoresql_externalpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/sql_external.py</a></li>
<li>CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/podding/</li>
<li>CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/query/</li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_externalpy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_external.py</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li>CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/query/</li>
<li><a href="#CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_legacypy">CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_legacy.py</a></li>
</ul>

<h3>Property Changed</h3>
<ul>
<li><a href="#CalendarServerbranchesusersgayacleanrevisions">CalendarServer/branches/users/gaya/cleanrevisions/</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="CalendarServerbranchesusersgayacleanrevisions"></a>
<div class="propset"><h4>Property changes: CalendarServer/branches/users/gaya/cleanrevisions</h4>
<pre class="diff"><span>
</span></pre></div>
<a id="svnmergeinfo"></a>
<div class="modfile"><h4>Modified: svn:mergeinfo</h4></div>
<span class="cx">/CalendarServer/branches/config-separation:4379-4443
</span><span class="cx">/CalendarServer/branches/egg-info-351:4589-4625
</span><span class="cx">/CalendarServer/branches/generic-sqlstore:6167-6191
</span><span class="cx">/CalendarServer/branches/new-store:5594-5934
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile:5911-5935
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile-2:5936-5981
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-4.3-dev:10180-10190,10192
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-5.1-dev:11846
</span><span class="cx">/CalendarServer/branches/users/cdaboo/batchupload-6699:6700-7198
</span><span class="cx">/CalendarServer/branches/users/cdaboo/cached-subscription-calendars-5692:5693-5702
</span><span class="cx">/CalendarServer/branches/users/cdaboo/component-set-fixes:8130-8346
</span><span class="cx">/CalendarServer/branches/users/cdaboo/directory-cache-on-demand-3627:3628-3644
</span><span class="cx">/CalendarServer/branches/users/cdaboo/fix-no-ischedule:11607-11871
</span><span class="cx">/CalendarServer/branches/users/cdaboo/implicituidrace:8137-8141
</span><span class="cx">/CalendarServer/branches/users/cdaboo/ischedule-dkim:9747-9979
</span><span class="cx">/CalendarServer/branches/users/cdaboo/json:11622-11912
</span><span class="cx">/CalendarServer/branches/users/cdaboo/managed-attachments:9985-10145
</span><span class="cx">/CalendarServer/branches/users/cdaboo/more-sharing-5591:5592-5601
</span><span class="cx">/CalendarServer/branches/users/cdaboo/partition-4464:4465-4957
</span><span class="cx">/CalendarServer/branches/users/cdaboo/performance-tweaks:11824-11836
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pods:7297-7377
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycalendar:7085-7206
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycard:7227-7237
</span><span class="cx">/CalendarServer/branches/users/cdaboo/queued-attendee-refreshes:7740-8287
</span><span class="cx">/CalendarServer/branches/users/cdaboo/relative-config-paths-5070:5071-5105
</span><span class="cx">/CalendarServer/branches/users/cdaboo/reverse-proxy-pods:11875-11900
</span><span class="cx">/CalendarServer/branches/users/cdaboo/shared-calendars-5187:5188-5440
</span><span class="cx">/CalendarServer/branches/users/cdaboo/sharing-in-the-store:11935-12016
</span><span class="cx">/CalendarServer/branches/users/cdaboo/store-scheduling:10876-11129
</span><span class="cx">/CalendarServer/branches/users/cdaboo/timezones:7443-7699
</span><span class="cx">/CalendarServer/branches/users/cdaboo/txn-debugging:8730-8743
</span><span class="cx">/CalendarServer/branches/users/gaya/sharedgroupfixes:12120-12142
</span><span class="cx">/CalendarServer/branches/users/gaya/sharedgroups-3:11088-11204
</span><span class="cx">/CalendarServer/branches/users/glyph/always-abort-txn-on-error:9958-9969
</span><span class="cx">/CalendarServer/branches/users/glyph/case-insensitive-uid:8772-8805
</span><span class="cx">/CalendarServer/branches/users/glyph/conn-limit:6574-6577
</span><span class="cx">/CalendarServer/branches/users/glyph/contacts-server-merge:4971-5080
</span><span class="cx">/CalendarServer/branches/users/glyph/dalify:6932-7023
</span><span class="cx">/CalendarServer/branches/users/glyph/db-reconnect:6824-6876
</span><span class="cx">/CalendarServer/branches/users/glyph/deploybuild:7563-7572
</span><span class="cx">/CalendarServer/branches/users/glyph/digest-auth-redux:10624-10635
</span><span class="cx">/CalendarServer/branches/users/glyph/disable-quota:7718-7727
</span><span class="cx">/CalendarServer/branches/users/glyph/dont-start-postgres:6592-6614
</span><span class="cx">/CalendarServer/branches/users/glyph/enforce-max-requests:11640-11643
</span><span class="cx">/CalendarServer/branches/users/glyph/hang-fix:11465-11491
</span><span class="cx">/CalendarServer/branches/users/glyph/imip-and-admin-html:7866-7984
</span><span class="cx">/CalendarServer/branches/users/glyph/ipv6-client:9054-9105
</span><span class="cx">/CalendarServer/branches/users/glyph/launchd-wrapper-bis:11413-11436
</span><span class="cx">/CalendarServer/branches/users/glyph/linux-tests:6893-6900
</span><span class="cx">/CalendarServer/branches/users/glyph/log-cleanups:11691-11731
</span><span class="cx">/CalendarServer/branches/users/glyph/migrate-merge:8690-8713
</span><span class="cx">/CalendarServer/branches/users/glyph/misc-portability-fixes:7365-7374
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-6:6322-6368
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-7:6369-6445
</span><span class="cx">/CalendarServer/branches/users/glyph/multiget-delete:8321-8330
</span><span class="cx">/CalendarServer/branches/users/glyph/new-export:7444-7485
</span><span class="cx">/CalendarServer/branches/users/glyph/one-home-list-api:10048-10073
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle:7106-7155
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle-nulls:7340-7351
</span><span class="cx">/CalendarServer/branches/users/glyph/other-html:8062-8091
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-sim:8240-8251
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade:8376-8400
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade_to_1:8571-8583
</span><span class="cx">/CalendarServer/branches/users/glyph/q:9560-9688
</span><span class="cx">/CalendarServer/branches/users/glyph/queue-locking-and-timing:10204-10289
</span><span class="cx">/CalendarServer/branches/users/glyph/quota:7604-7637
</span><span class="cx">/CalendarServer/branches/users/glyph/sendfdport:5388-5424
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-fixes:8436-8443
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-take2:8155-8174
</span><span class="cx">/CalendarServer/branches/users/glyph/sharedpool:6490-6550
</span><span class="cx">/CalendarServer/branches/users/glyph/sharing-api:9192-9205
</span><span class="cx">/CalendarServer/branches/users/glyph/skip-lonely-vtimezones:8524-8535
</span><span class="cx">/CalendarServer/branches/users/glyph/sql-store:5929-6073
</span><span class="cx">/CalendarServer/branches/users/glyph/start-service-start-loop:11060-11065
</span><span class="cx">/CalendarServer/branches/users/glyph/subtransactions:7248-7258
</span><span class="cx">/CalendarServer/branches/users/glyph/table-alias:8651-8664
</span><span class="cx">/CalendarServer/branches/users/glyph/uidexport:7673-7676
</span><span class="cx">/CalendarServer/branches/users/glyph/unshare-when-access-revoked:10562-10595
</span><span class="cx">/CalendarServer/branches/users/glyph/use-system-twisted:5084-5149
</span><span class="cx">/CalendarServer/branches/users/glyph/uuid-normalize:9268-9296
</span><span class="cx">/CalendarServer/branches/users/glyph/warning-cleanups:11347-11357
</span><span class="cx">/CalendarServer/branches/users/glyph/whenNotProposed:11881-11897
</span><span class="cx">/CalendarServer/branches/users/glyph/xattrs-from-files:7757-7769
</span><span class="cx">/CalendarServer/branches/users/sagen/applepush:8126-8184
</span><span class="cx">/CalendarServer/branches/users/sagen/inboxitems:7380-7381
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources:5032-5051
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources-2:5052-5061
</span><span class="cx">/CalendarServer/branches/users/sagen/purge_old_events:6735-6746
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4038:4040-4067
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4066:4068-4075
</span><span class="cx">/CalendarServer/branches/users/sagen/resources-2:5084-5093
</span><span class="cx">/CalendarServer/branches/users/sagen/testing:10827-10851,10853-10855
</span><span class="cx">/CalendarServer/branches/users/wsanchez/transations:5515-5593
</span><span class="cx">   + /CalDAVTester/trunk:11193-11198
</span><span class="cx">/CalendarServer/branches/config-separation:4379-4443
</span><span class="cx">/CalendarServer/branches/egg-info-351:4589-4625
</span><span class="cx">/CalendarServer/branches/generic-sqlstore:6167-6191
</span><span class="cx">/CalendarServer/branches/new-store:5594-5934
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile:5911-5935
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile-2:5936-5981
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-4.3-dev:10180-10190,10192
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-5.1-dev:11846
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-5.2-dev:11972
</span><span class="cx">/CalendarServer/branches/users/cdaboo/batchupload-6699:6700-7198
</span><span class="cx">/CalendarServer/branches/users/cdaboo/cached-subscription-calendars-5692:5693-5702
</span><span class="cx">/CalendarServer/branches/users/cdaboo/component-set-fixes:8130-8346
</span><span class="cx">/CalendarServer/branches/users/cdaboo/cross-pod-sharing:12038-12191
</span><span class="cx">/CalendarServer/branches/users/cdaboo/directory-cache-on-demand-3627:3628-3644
</span><span class="cx">/CalendarServer/branches/users/cdaboo/fix-no-ischedule:11607-11871
</span><span class="cx">/CalendarServer/branches/users/cdaboo/implicituidrace:8137-8141
</span><span class="cx">/CalendarServer/branches/users/cdaboo/ischedule-dkim:9747-9979
</span><span class="cx">/CalendarServer/branches/users/cdaboo/json:11622-11912
</span><span class="cx">/CalendarServer/branches/users/cdaboo/managed-attachments:9985-10145
</span><span class="cx">/CalendarServer/branches/users/cdaboo/more-sharing-5591:5592-5601
</span><span class="cx">/CalendarServer/branches/users/cdaboo/partition-4464:4465-4957
</span><span class="cx">/CalendarServer/branches/users/cdaboo/performance-tweaks:11824-11836
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pods:7297-7377
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycalendar:7085-7206
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycard:7227-7237
</span><span class="cx">/CalendarServer/branches/users/cdaboo/queued-attendee-refreshes:7740-8287
</span><span class="cx">/CalendarServer/branches/users/cdaboo/relative-config-paths-5070:5071-5105
</span><span class="cx">/CalendarServer/branches/users/cdaboo/reverse-proxy-pods:11875-11900
</span><span class="cx">/CalendarServer/branches/users/cdaboo/shared-calendars-5187:5188-5440
</span><span class="cx">/CalendarServer/branches/users/cdaboo/sharing-in-the-store:11935-12016
</span><span class="cx">/CalendarServer/branches/users/cdaboo/store-scheduling:10876-11129
</span><span class="cx">/CalendarServer/branches/users/cdaboo/timezones:7443-7699
</span><span class="cx">/CalendarServer/branches/users/cdaboo/txn-debugging:8730-8743
</span><span class="cx">/CalendarServer/branches/users/gaya/sharedgroupfixes:12120-12142
</span><span class="cx">/CalendarServer/branches/users/gaya/sharedgroups-3:11088-11204
</span><span class="cx">/CalendarServer/branches/users/glyph/always-abort-txn-on-error:9958-9969
</span><span class="cx">/CalendarServer/branches/users/glyph/case-insensitive-uid:8772-8805
</span><span class="cx">/CalendarServer/branches/users/glyph/conn-limit:6574-6577
</span><span class="cx">/CalendarServer/branches/users/glyph/contacts-server-merge:4971-5080
</span><span class="cx">/CalendarServer/branches/users/glyph/dalify:6932-7023
</span><span class="cx">/CalendarServer/branches/users/glyph/db-reconnect:6824-6876
</span><span class="cx">/CalendarServer/branches/users/glyph/deploybuild:7563-7572
</span><span class="cx">/CalendarServer/branches/users/glyph/digest-auth-redux:10624-10635
</span><span class="cx">/CalendarServer/branches/users/glyph/disable-quota:7718-7727
</span><span class="cx">/CalendarServer/branches/users/glyph/dont-start-postgres:6592-6614
</span><span class="cx">/CalendarServer/branches/users/glyph/enforce-max-requests:11640-11643
</span><span class="cx">/CalendarServer/branches/users/glyph/hang-fix:11465-11491
</span><span class="cx">/CalendarServer/branches/users/glyph/imip-and-admin-html:7866-7984
</span><span class="cx">/CalendarServer/branches/users/glyph/ipv6-client:9054-9105
</span><span class="cx">/CalendarServer/branches/users/glyph/launchd-wrapper-bis:11413-11436
</span><span class="cx">/CalendarServer/branches/users/glyph/linux-tests:6893-6900
</span><span class="cx">/CalendarServer/branches/users/glyph/log-cleanups:11691-11731
</span><span class="cx">/CalendarServer/branches/users/glyph/migrate-merge:8690-8713
</span><span class="cx">/CalendarServer/branches/users/glyph/misc-portability-fixes:7365-7374
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-6:6322-6368
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-7:6369-6445
</span><span class="cx">/CalendarServer/branches/users/glyph/multiget-delete:8321-8330
</span><span class="cx">/CalendarServer/branches/users/glyph/new-export:7444-7485
</span><span class="cx">/CalendarServer/branches/users/glyph/one-home-list-api:10048-10073
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle:7106-7155
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle-nulls:7340-7351
</span><span class="cx">/CalendarServer/branches/users/glyph/other-html:8062-8091
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-sim:8240-8251
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade:8376-8400
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade_to_1:8571-8583
</span><span class="cx">/CalendarServer/branches/users/glyph/q:9560-9688
</span><span class="cx">/CalendarServer/branches/users/glyph/queue-locking-and-timing:10204-10289
</span><span class="cx">/CalendarServer/branches/users/glyph/quota:7604-7637
</span><span class="cx">/CalendarServer/branches/users/glyph/sendfdport:5388-5424
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-fixes:8436-8443
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-take2:8155-8174
</span><span class="cx">/CalendarServer/branches/users/glyph/sharedpool:6490-6550
</span><span class="cx">/CalendarServer/branches/users/glyph/sharing-api:9192-9205
</span><span class="cx">/CalendarServer/branches/users/glyph/skip-lonely-vtimezones:8524-8535
</span><span class="cx">/CalendarServer/branches/users/glyph/sql-store:5929-6073
</span><span class="cx">/CalendarServer/branches/users/glyph/start-service-start-loop:11060-11065
</span><span class="cx">/CalendarServer/branches/users/glyph/subtransactions:7248-7258
</span><span class="cx">/CalendarServer/branches/users/glyph/table-alias:8651-8664
</span><span class="cx">/CalendarServer/branches/users/glyph/uidexport:7673-7676
</span><span class="cx">/CalendarServer/branches/users/glyph/unshare-when-access-revoked:10562-10595
</span><span class="cx">/CalendarServer/branches/users/glyph/use-system-twisted:5084-5149
</span><span class="cx">/CalendarServer/branches/users/glyph/uuid-normalize:9268-9296
</span><span class="cx">/CalendarServer/branches/users/glyph/warning-cleanups:11347-11357
</span><span class="cx">/CalendarServer/branches/users/glyph/whenNotProposed:11881-11897
</span><span class="cx">/CalendarServer/branches/users/glyph/xattrs-from-files:7757-7769
</span><span class="cx">/CalendarServer/branches/users/sagen/applepush:8126-8184
</span><span class="cx">/CalendarServer/branches/users/sagen/inboxitems:7380-7381
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources:5032-5051
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources-2:5052-5061
</span><span class="cx">/CalendarServer/branches/users/sagen/purge_old_events:6735-6746
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4038:4040-4067
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4066:4068-4075
</span><span class="cx">/CalendarServer/branches/users/sagen/resources-2:5084-5093
</span><span class="cx">/CalendarServer/branches/users/sagen/testing:10827-10851,10853-10855
</span><span class="cx">/CalendarServer/branches/users/wsanchez/transations:5515-5593
</span><a id="CalendarServerbranchesusersgayacleanrevisionsREADME"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/README (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/README        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/README        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -12,7 +12,7 @@
</span><span class="cx"> Copyright and License
</span><span class="cx"> =====================
</span><span class="cx"> 
</span><del>-Copyright (c) 2005-2013 Apple Inc.  All rights reserved.
</del><ins>+Copyright (c) 2005-2014 Apple Inc.  All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> This software is licensed under the Apache License, Version 2.0.  The
</span><span class="cx"> Apache License is a well-established open source license, enabling
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbenchmark"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/benchmark (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/benchmark        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/benchmark        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/bin/sh
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbenchreport"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/benchreport (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/benchreport        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/benchreport        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/bin/sh
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbin_calendarserver_preamblepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/_calendarserver_preamble.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/_calendarserver_preamble.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/_calendarserver_preamble.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincaldavd"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/caldavd (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/caldavd        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/caldavd        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx"> # -*- sh-basic-offset: 2 -*-
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_backup"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_backup (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_backup        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_backup        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_bootstrap_database"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_bootstrap_database (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_bootstrap_database        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_bootstrap_database        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_command_gateway"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_command_gateway (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_command_gateway        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_command_gateway        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_config"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_config (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_config        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_config        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_dbinspect"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_dbinspect (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_dbinspect        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_dbinspect        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_dkimtool"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_dkimtool (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_dkimtool        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_dkimtool        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_export"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_export (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_export        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_export        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_icalendar_validate"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_icalendar_validate (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_icalendar_validate        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_icalendar_validate        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_load_augmentdb"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_load_augmentdb (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_load_augmentdb        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_load_augmentdb        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_manage_postgres"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_manage_postgres (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_manage_postgres        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_manage_postgres        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_manage_principals"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_manage_principals (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_manage_principals        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_manage_principals        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_manage_push"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_manage_push (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_manage_push        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_manage_push        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_manage_timezones"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_manage_timezones (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_manage_timezones        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_manage_timezones        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_migrate_resources"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_migrate_resources (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_migrate_resources        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_migrate_resources        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_monitor_amp_notifications"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_monitor_amp_notifications (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_monitor_amp_notifications        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_monitor_amp_notifications        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_monitor_notifications"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_monitor_notifications (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_monitor_notifications        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_monitor_notifications        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_monitor_work"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_monitor_work (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_monitor_work        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_monitor_work        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_purge_attachments"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_purge_attachments (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_purge_attachments        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_purge_attachments        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_purge_events"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_purge_events (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_purge_events        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_purge_events        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_purge_principals"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_purge_principals (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_purge_principals        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_purge_principals        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_shell"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_shell (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_shell        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_shell        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_upgrade"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_upgrade (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_upgrade        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_upgrade        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbincalendarserver_verify_data"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_verify_data (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_verify_data        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/calendarserver_verify_data        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbinicalendar_split"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/icalendar_split (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/icalendar_split        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/icalendar_split        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbinproxyclean"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/proxyclean (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/proxyclean        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/proxyclean        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbintrial"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/trial (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/trial        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/trial        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsbintwistd"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/bin/twistd (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/bin/twistd        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/bin/twistd        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserver__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: calendarserver -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserveraccesslogpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/accesslog.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/accesslog.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/accesslog.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservercontrolsocketpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/controlsocket.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/controlsocket.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/controlsocket.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverlogAnalysispy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/logAnalysis.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/logAnalysis.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/logAnalysis.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverplatform__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwin__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwin_saclc"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/_sacl.c (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/_sacl.c        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/_sacl.c        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx">  * you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwinod__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwinoddsattributespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/dsattributes.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/dsattributes.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/dsattributes.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwinoddsquerypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/dsquery.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/dsquery.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/dsquery.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwinodopendirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/opendirectory.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/opendirectory.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/opendirectory.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwinodsetup_directorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/setup_directory.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/setup_directory.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/setup_directory.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwinodsetup_testuserspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/setup_testusers.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/setup_testusers.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/setup_testusers.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwinodtest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwinodtesttest_opendirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/test/test_opendirectory.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/test/test_opendirectory.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/od/test/test_opendirectory.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverplatformdarwinwikipy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/wiki.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/wiki.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/platform/darwin/wiki.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverprovision__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/provision/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/provision/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/provision/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverprovisionrootpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/provision/root.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/provision/root.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/provision/root.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: calendarserver.provision.test.test_root -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverprovisiontest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/provision/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/provision/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/provision/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverprovisiontesttest_rootpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/provision/test/test_root.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/provision/test/test_root.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/provision/test/test_root.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverpush__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverpushamppushpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/amppush.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/amppush.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/amppush.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverpushapplepushpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/applepush.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/applepush.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/applepush.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: calendarserver.push.test.test_applepush -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverpushnotifierpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/notifier.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/notifier.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/notifier.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverpushtest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverpushtesttest_amppushpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/test/test_amppush.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/test/test_amppush.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/test/test_amppush.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverpushtesttest_applepushpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/test/test_applepush.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/test/test_applepush.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/test/test_applepush.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverpushtesttest_notifierpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/test/test_notifier.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/test/test_notifier.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/test/test_notifier.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -184,10 +184,10 @@
</span><span class="cx"> class NotifierFactory(StoreTestCase):
</span><span class="cx"> 
</span><span class="cx">     requirements = {
</span><del>-        &quot;home1&quot; : {
</del><ins>+        &quot;user01&quot; : {
</ins><span class="cx">             &quot;calendar_1&quot; : {}
</span><span class="cx">         },
</span><del>-        &quot;home2&quot; : {
</del><ins>+        &quot;user02&quot; : {
</ins><span class="cx">             &quot;calendar_1&quot; : {}
</span><span class="cx">         },
</span><span class="cx">     }
</span><span class="lines">@@ -208,23 +208,23 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_homeNotifier(self):
</span><span class="cx"> 
</span><del>-        home = yield self.homeUnderTest()
</del><ins>+        home = yield self.homeUnderTest(name=&quot;user01&quot;)
</ins><span class="cx">         yield home.notifyChanged(category=ChangeCategory.default)
</span><span class="cx">         self.assertEquals(self.notifierFactory.history,
</span><del>-            [(&quot;/CalDAV/example.com/home1/&quot;, PushPriority.high)])
</del><ins>+            [(&quot;/CalDAV/example.com/user01/&quot;, PushPriority.high)])
</ins><span class="cx">         yield self.commit()
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_calendarNotifier(self):
</span><span class="cx"> 
</span><del>-        calendar = yield self.calendarUnderTest()
</del><ins>+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;)
</ins><span class="cx">         yield calendar.notifyChanged(category=ChangeCategory.default)
</span><span class="cx">         self.assertEquals(
</span><span class="cx">             set(self.notifierFactory.history),
</span><span class="cx">             set([
</span><del>-                (&quot;/CalDAV/example.com/home1/&quot;, PushPriority.high),
-                (&quot;/CalDAV/example.com/home1/calendar_1/&quot;, PushPriority.high)])
</del><ins>+                (&quot;/CalDAV/example.com/user01/&quot;, PushPriority.high),
+                (&quot;/CalDAV/example.com/user01/calendar_1/&quot;, PushPriority.high)])
</ins><span class="cx">         )
</span><span class="cx">         yield self.commit()
</span><span class="cx"> 
</span><span class="lines">@@ -232,28 +232,28 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_shareWithNotifier(self):
</span><span class="cx"> 
</span><del>-        calendar = yield self.calendarUnderTest()
-        yield calendar.inviteUserToShare(&quot;home2&quot;, _BIND_MODE_WRITE, &quot;&quot;)
</del><ins>+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;)
+        yield calendar.inviteUserToShare(&quot;user02&quot;, _BIND_MODE_WRITE, &quot;&quot;)
</ins><span class="cx">         self.assertEquals(
</span><span class="cx">             set(self.notifierFactory.history),
</span><span class="cx">             set([
</span><del>-                (&quot;/CalDAV/example.com/home1/&quot;, PushPriority.high),
-                (&quot;/CalDAV/example.com/home1/calendar_1/&quot;, PushPriority.high),
-                (&quot;/CalDAV/example.com/home2/&quot;, PushPriority.high),
-                (&quot;/CalDAV/example.com/home2/notification/&quot;, PushPriority.high),
</del><ins>+                (&quot;/CalDAV/example.com/user01/&quot;, PushPriority.high),
+                (&quot;/CalDAV/example.com/user01/calendar_1/&quot;, PushPriority.high),
+                (&quot;/CalDAV/example.com/user02/&quot;, PushPriority.high),
+                (&quot;/CalDAV/example.com/user02/notification/&quot;, PushPriority.high),
</ins><span class="cx">             ])
</span><span class="cx">         )
</span><span class="cx">         yield self.commit()
</span><span class="cx"> 
</span><del>-        calendar = yield self.calendarUnderTest()
-        yield calendar.uninviteUserFromShare(&quot;home2&quot;)
</del><ins>+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;)
+        yield calendar.uninviteUserFromShare(&quot;user02&quot;)
</ins><span class="cx">         self.assertEquals(
</span><span class="cx">             set(self.notifierFactory.history),
</span><span class="cx">             set([
</span><del>-                (&quot;/CalDAV/example.com/home1/&quot;, PushPriority.high),
-                (&quot;/CalDAV/example.com/home1/calendar_1/&quot;, PushPriority.high),
-                (&quot;/CalDAV/example.com/home2/&quot;, PushPriority.high),
-                (&quot;/CalDAV/example.com/home2/notification/&quot;, PushPriority.high),
</del><ins>+                (&quot;/CalDAV/example.com/user01/&quot;, PushPriority.high),
+                (&quot;/CalDAV/example.com/user01/calendar_1/&quot;, PushPriority.high),
+                (&quot;/CalDAV/example.com/user02/&quot;, PushPriority.high),
+                (&quot;/CalDAV/example.com/user02/notification/&quot;, PushPriority.high),
</ins><span class="cx">             ])
</span><span class="cx">         )
</span><span class="cx">         yield self.commit()
</span><span class="lines">@@ -262,20 +262,20 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_sharedCalendarNotifier(self):
</span><span class="cx"> 
</span><del>-        calendar = yield self.calendarUnderTest()
-        shareeView = yield calendar.inviteUserToShare(&quot;home2&quot;, _BIND_MODE_WRITE, &quot;&quot;)
</del><ins>+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;)
+        shareeView = yield calendar.inviteUserToShare(&quot;user02&quot;, _BIND_MODE_WRITE, &quot;&quot;)
</ins><span class="cx">         yield shareeView.acceptShare(&quot;&quot;)
</span><span class="cx">         shareName = shareeView.name()
</span><span class="cx">         yield self.commit()
</span><span class="cx">         self.notifierFactory.reset()
</span><span class="cx"> 
</span><del>-        shared = yield self.calendarUnderTest(home=&quot;home2&quot;, name=shareName)
</del><ins>+        shared = yield self.calendarUnderTest(home=&quot;user02&quot;, name=shareName)
</ins><span class="cx">         yield shared.notifyChanged(category=ChangeCategory.default)
</span><span class="cx">         self.assertEquals(
</span><span class="cx">             set(self.notifierFactory.history),
</span><span class="cx">             set([
</span><del>-                (&quot;/CalDAV/example.com/home1/&quot;, PushPriority.high),
-                (&quot;/CalDAV/example.com/home1/calendar_1/&quot;, PushPriority.high)])
</del><ins>+                (&quot;/CalDAV/example.com/user01/&quot;, PushPriority.high),
+                (&quot;/CalDAV/example.com/user01/calendar_1/&quot;, PushPriority.high)])
</ins><span class="cx">         )
</span><span class="cx">         yield self.commit()
</span><span class="cx"> 
</span><span class="lines">@@ -283,12 +283,12 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_notificationNotifier(self):
</span><span class="cx"> 
</span><del>-        notifications = yield self.transactionUnderTest().notificationsWithUID(&quot;home1&quot;)
</del><ins>+        notifications = yield self.transactionUnderTest().notificationsWithUID(&quot;user01&quot;)
</ins><span class="cx">         yield notifications.notifyChanged(category=ChangeCategory.default)
</span><span class="cx">         self.assertEquals(
</span><span class="cx">             set(self.notifierFactory.history),
</span><span class="cx">             set([
</span><del>-                (&quot;/CalDAV/example.com/home1/&quot;, PushPriority.high),
-                (&quot;/CalDAV/example.com/home1/notification/&quot;, PushPriority.high)])
</del><ins>+                (&quot;/CalDAV/example.com/user01/&quot;, PushPriority.high),
+                (&quot;/CalDAV/example.com/user01/notification/&quot;, PushPriority.high)])
</ins><span class="cx">         )
</span><span class="cx">         yield self.commit()
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverpushutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/push/util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertap__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertapcaldavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/caldav.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/caldav.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/caldav.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: calendarserver.tap.test.test_caldav -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -1693,11 +1693,9 @@
</span><span class="cx">                 raise StoreNotAvailable()
</span><span class="cx"> 
</span><span class="cx">             from twisted.internet import reactor
</span><del>-            pool = PeerConnectionPool(reactor, store.newTransaction,
-                                      7654, schema)
</del><ins>+            pool = PeerConnectionPool(reactor, store.newTransaction, config.WorkQueue.ampPort, schema)
</ins><span class="cx">             store.queuer = store.queuer.transferProposalCallbacks(pool)
</span><del>-            controlSocket.addFactory(_QUEUE_ROUTE,
-                                     pool.workerListenerFactory())
</del><ins>+            controlSocket.addFactory(_QUEUE_ROUTE, pool.workerListenerFactory())
</ins><span class="cx">             # TODO: now that we have the shared control socket, we should get
</span><span class="cx">             # rid of the connection dispenser and make a shared / async
</span><span class="cx">             # connection pool implementation that can dispense transactions
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertapcfgchildpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/cfgchild.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/cfgchild.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/cfgchild.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertapprofilingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/profiling.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/profiling.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/profiling.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertaptest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertaptestlonglinespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/test/longlines.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/test/longlines.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/test/longlines.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2007-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2007-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertaptesttest_caldavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/test/test_caldav.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/test/test_caldav.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/test/test_caldav.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2007-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2007-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertaptesttest_utilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/test/test_util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/test/test_util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/test/test_util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2007-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2007-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertaputilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tap/util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: calendarserver.tap.test.test_caldav -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -92,6 +92,7 @@
</span><span class="cx"> from calendarserver.webadmin.resource import WebAdminResource
</span><span class="cx"> from calendarserver.webcal.resource import WebCalendarResource
</span><span class="cx"> 
</span><ins>+from txdav.common.datastore.podding.resource import ConduitResource
</ins><span class="cx"> from txdav.common.datastore.sql import CommonDataStore as CommonSQLDataStore
</span><span class="cx"> from txdav.common.datastore.file import CommonDataStore as CommonFileDataStore
</span><span class="cx"> from txdav.common.datastore.sql import current_sql_schema
</span><span class="lines">@@ -407,6 +408,7 @@
</span><span class="cx">     rootResourceClass = RootResource
</span><span class="cx">     calendarResourceClass = DirectoryCalendarHomeProvisioningResource
</span><span class="cx">     iScheduleResourceClass = IScheduleInboxResource
</span><ins>+    conduitResourceClass = ConduitResource
</ins><span class="cx">     timezoneServiceResourceClass = TimezoneServiceResource
</span><span class="cx">     timezoneStdServiceResourceClass = TimezoneStdServiceResource
</span><span class="cx">     webCalendarResourceClass = WebCalendarResource
</span><span class="lines">@@ -636,7 +638,7 @@
</span><span class="cx">             addSystemEventTrigger(&quot;after&quot;, &quot;startup&quot;, timezoneStdService.onStartup)
</span><span class="cx"> 
</span><span class="cx">     #
</span><del>-    # iSchedule service for podding
</del><ins>+    # iSchedule/cross-pod service for podding
</ins><span class="cx">     #
</span><span class="cx">     if config.Servers.Enabled:
</span><span class="cx">         log.info(&quot;Setting up iSchedule podding inbox resource: {cls}&quot;, cls=iScheduleResourceClass)
</span><span class="lines">@@ -648,6 +650,14 @@
</span><span class="cx">         )
</span><span class="cx">         root.putChild(config.Servers.InboxName, ischedule)
</span><span class="cx"> 
</span><ins>+        log.info(&quot;Setting up podding conduit resource: {cls}&quot;, cls=conduitResourceClass)
+
+        conduit = conduitResourceClass(
+            root,
+            newStore,
+        )
+        root.putChild(config.Servers.ConduitName, conduit)
+
</ins><span class="cx">     #
</span><span class="cx">     # iSchedule service (not used for podding)
</span><span class="cx">     #
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertesttest_logAnalysispy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/test/test_logAnalysis.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/test/test_logAnalysis.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/test/test_logAnalysis.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertools__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsagentpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/agent.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/agent.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/agent.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> # -*- test-case-name: calendarserver.tools.test.test_agent -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsampnotificationspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/ampnotifications.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/ampnotifications.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/ampnotifications.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsanonymizepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/anonymize.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/anonymize.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/anonymize.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsbackuppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/backup.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/backup.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/backup.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsbackup_pgpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/backup_pg.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/backup_pg.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/backup_pg.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsbootstrapdatabasepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/bootstrapdatabase.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/bootstrapdatabase.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/bootstrapdatabase.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolscalverifypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/calverify.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/calverify.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/calverify.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> # -*- test-case-name: calendarserver.tools.test.test_calverify -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -72,6 +72,9 @@
</span><span class="cx"> from twistedcaldav.util import normalizationLookup
</span><span class="cx"> 
</span><span class="cx"> from txdav.caldav.icalendarstore import ComponentUpdateState
</span><ins>+from txdav.caldav.datastore.scheduling.icalsplitter import iCalSplitter
+from txdav.caldav.datastore.scheduling.implicit import ImplicitScheduler
+from txdav.caldav.datastore.sql import CalendarStoreFeatures
</ins><span class="cx"> from txdav.common.datastore.sql_tables import schema, _BIND_MODE_OWN
</span><span class="cx"> from txdav.common.icommondatastore import InternalDataStoreError
</span><span class="cx"> 
</span><span class="lines">@@ -206,7 +209,7 @@
</span><span class="cx"> if not hasattr(Component, &quot;maxAlarmCounts&quot;):
</span><span class="cx">     Component.hasDuplicateAlarms = new_hasDuplicateAlarms
</span><span class="cx"> 
</span><del>-VERSION = &quot;10&quot;
</del><ins>+VERSION = &quot;11&quot;
</ins><span class="cx"> 
</span><span class="cx"> def printusage(e=None):
</span><span class="cx">     if e:
</span><span class="lines">@@ -240,6 +243,7 @@
</span><span class="cx">                       with either --ical or --mismatch.
</span><span class="cx"> --double            : detect double-bookings.
</span><span class="cx"> --dark-purge        : purge room/resource events with invalid organizer
</span><ins>+--split             : split recurring event
</ins><span class="cx"> 
</span><span class="cx"> --nuke PATH|RID     : remove specific calendar resources - can
</span><span class="cx">                       only be used by itself. PATH is the full
</span><span class="lines">@@ -275,6 +279,10 @@
</span><span class="cx"> --summary  : report only which GUIDs have double-bookings - no details.
</span><span class="cx"> --days     : number of days ahead to scan [DEFAULT: 365]
</span><span class="cx"> 
</span><ins>+Options for --double:
+If none of (--no-organizer, --invalid-organizer, --disabled-organizer) is present, it
+will default to (--invalid-organizer, --disabled-organizer).
+
</ins><span class="cx"> Options for --dark-purge:
</span><span class="cx"> 
</span><span class="cx"> --uuid     : only scan specified calendar homes. Can be a partial GUID
</span><span class="lines">@@ -285,9 +293,12 @@
</span><span class="cx"> --invalid-organizer  : only detect events with an organizer not in the directory
</span><span class="cx"> --disabled-organizer : only detect events with an organizer disabled for calendaring
</span><span class="cx"> 
</span><del>-If none of (--no-organizer, --invalid-organizer, --disabled-organizer) is present, it
-will default to (--invalid-organizer, --disabled-organizer).
</del><ins>+Options for --split:
</ins><span class="cx"> 
</span><ins>+--path     : URI path to resource to split.
+--rid      : UTC date-time where split occurs (YYYYMMDDTHHMMSSZ).
+--summary  : only print a list of recurrences in the resource - no splitting.
+
</ins><span class="cx"> CHANGES
</span><span class="cx"> v8: Detects ORGANIZER or ATTENDEE properties with mailto: calendar user
</span><span class="cx">     addresses for users that have valid directory records. Fix is to
</span><span class="lines">@@ -295,6 +306,10 @@
</span><span class="cx"> 
</span><span class="cx"> v9: Detects double-bookings.
</span><span class="cx"> 
</span><ins>+v10: Purges data for invalid users.
+
+v11: Allows manual splitting of recurring events.
+
</ins><span class="cx"> &quot;&quot;&quot; % (VERSION,)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -319,10 +334,11 @@
</span><span class="cx">         ['missing', 'm', &quot;Show 'orphaned' homes.&quot;],
</span><span class="cx">         ['double', 'd', &quot;Detect double-bookings.&quot;],
</span><span class="cx">         ['dark-purge', 'p', &quot;Purge room/resource events with invalid organizer.&quot;],
</span><ins>+        ['split', 'l', &quot;Split an event.&quot;],
</ins><span class="cx">         ['fix', 'x', &quot;Fix problems.&quot;],
</span><span class="cx">         ['verbose', 'v', &quot;Verbose logging.&quot;],
</span><span class="cx">         ['details', 'V', &quot;Detailed logging.&quot;],
</span><del>-        ['summary', 'S', &quot;Summary of double-bookings.&quot;],
</del><ins>+        ['summary', 'S', &quot;Summary of double-bookings/split.&quot;],
</ins><span class="cx">         ['tzid', 't', &quot;Timezone to adjust displayed times to.&quot;],
</span><span class="cx"> 
</span><span class="cx">         ['no-organizer', '', &quot;Detect dark events without an organizer&quot;],
</span><span class="lines">@@ -335,7 +351,9 @@
</span><span class="cx">         ['uuid', 'u', &quot;&quot;, &quot;Only check this user.&quot;],
</span><span class="cx">         ['uid', 'U', &quot;&quot;, &quot;Only this event UID.&quot;],
</span><span class="cx">         ['nuke', 'e', &quot;&quot;, &quot;Remove event given its path.&quot;],
</span><del>-        ['days', 'T', &quot;365&quot;, &quot;Number of days for scanning events into the future.&quot;]
</del><ins>+        ['days', 'T', &quot;365&quot;, &quot;Number of days for scanning events into the future.&quot;],
+        ['path', '', &quot;&quot;, &quot;Split event given its path.&quot;],
+        ['rid', '', &quot;&quot;, &quot;Split date-time.&quot;],
</ins><span class="cx">     ]
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -2670,6 +2688,122 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+class EventSplitService(CalVerifyService):
+    &quot;&quot;&quot;
+    Service which splits a recurring event at a specific date-time value.
+    &quot;&quot;&quot;
+
+    def title(self):
+        return &quot;Event Split Service&quot;
+
+
+    @inlineCallbacks
+    def doAction(self):
+        &quot;&quot;&quot;
+        Split a resource using either its path or resource id.
+        &quot;&quot;&quot;
+
+        self.txn = self.store.newTransaction()
+
+        path = self.options[&quot;path&quot;]
+        if path.startswith(&quot;/calendars/__uids__/&quot;):
+            try:
+                pathbits = path.split(&quot;/&quot;)
+            except TypeError:
+                printusage(&quot;Not a valid calendar object resource path: %s&quot; % (path,))
+            if len(pathbits) != 6:
+                printusage(&quot;Not a valid calendar object resource path: %s&quot; % (path,))
+            homeName = pathbits[3]
+            calendarName = pathbits[4]
+            resourceName = pathbits[5]
+
+            resid = yield self.getResourceID(homeName, calendarName, resourceName)
+            if resid is None:
+                yield self.txn.commit()
+                self.txn = None
+                self.output.write(&quot;\n&quot;)
+                self.output.write(&quot;Path does not exist. Nothing split.\n&quot;)
+                returnValue(None)
+            resid = int(resid)
+        else:
+            try:
+                resid = int(path)
+            except ValueError:
+                printusage(&quot;path argument must be a calendar object path or an SQL resource-id&quot;)
+
+        calendarObj = yield CalendarStoreFeatures(self.txn._store).calendarObjectWithID(self.txn, resid)
+        ical = yield calendarObj.component()
+
+        # Must be the ORGANIZER's copy
+        organizer = ical.getOrganizer()
+        if organizer is None:
+            printusage(&quot;Calendar object has no ORGANIZER property - cannot split&quot;)
+
+        # Only allow organizers to split
+        scheduler = ImplicitScheduler()
+        is_attendee = (yield scheduler.testAttendeeEvent(calendarObj.calendar(), calendarObj, ical,))
+        if is_attendee:
+            printusage(&quot;Calendar object is not owned by the ORGANIZER - cannot split&quot;)
+
+        if self.options[&quot;summary&quot;]:
+            result = self.doSummary(ical)
+        else:
+            result = yield self.doSplit(resid, calendarObj, ical)
+
+        returnValue(result)
+
+
+    def doSummary(self, ical):
+        &quot;&quot;&quot;
+        Print a summary of the recurrence instances of the specified event.
+
+        @param ical: calendar to process
+        @type ical: L{Component}
+        &quot;&quot;&quot;
+        self.output.write(&quot;\n---- Calendar resource instances ----\n&quot;)
+
+        # Find the instance RECURRENCE-ID where a split is going to happen
+        now = DateTime.getNowUTC()
+        now.offsetDay(1)
+        instances = ical.cacheExpandedTimeRanges(now)
+        instances = sorted(instances.instances.values(), key=lambda x: x.start)
+        for instance in instances:
+            self.output.write(instance.rid.getText() + (&quot; *\n&quot; if instance.overridden else &quot;\n&quot;))
+
+
+    @inlineCallbacks
+    def doSplit(self, resid, calendarObj, ical):
+        rid = self.options[&quot;rid&quot;]
+        try:
+            if rid[-1] != &quot;Z&quot;:
+                raise ValueError
+            rid = DateTime.parseText(rid)
+        except ValueError:
+            printusage(&quot;rid must be a valid UTC date-time value: 'YYYYMMDDTHHMMSSZ'&quot;)
+
+        self.output.write(&quot;\n---- Splitting calendar resource ----\n&quot;)
+
+        # Find actual RECURRENCE-ID of split
+        splitter = iCalSplitter(1024, 14)
+        rid = splitter.whereSplit(ical, break_point=rid, allow_past_the_end=False)
+        if rid is None:
+            printusage(&quot;rid is not a valid recurrence instance&quot;)
+
+        self.output.write(&quot;\n&quot;)
+        self.output.write(&quot;Actual RECURRENCE-ID: %s.\n&quot; % (rid,))
+
+        oldUID = yield calendarObj.split(rid=rid)
+
+        self.output.write(&quot;\n&quot;)
+        self.output.write(&quot;Split Resource: %s at %s, old UID: %s.\n&quot; % (resid, rid, oldUID,))
+
+        yield self.txn.commit()
+        self.txn = None
+
+        returnValue(oldUID)
+
+
+
</ins><span class="cx"> def main(argv=sys.argv, stderr=sys.stderr, reactor=None):
</span><span class="cx"> 
</span><span class="cx">     if reactor is None:
</span><span class="lines">@@ -2702,6 +2836,8 @@
</span><span class="cx">             return DoubleBookingService(store, options, output, reactor, config)
</span><span class="cx">         elif options[&quot;dark-purge&quot;]:
</span><span class="cx">             return DarkPurgeService(store, options, output, reactor, config)
</span><ins>+        elif options[&quot;split&quot;]:
+            return EventSplitService(store, options, output, reactor, config)
</ins><span class="cx">         else:
</span><span class="cx">             printusage(&quot;Invalid operation&quot;)
</span><span class="cx">             sys.exit(1)
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolscalverify_diffpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/calverify_diff.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/calverify_diff.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/calverify_diff.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> # -*- test-case-name: calendarserver.tools.test.test_calverify -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolschangeip_calendarpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/changeip_calendar.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/changeip_calendar.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/changeip_calendar.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx"> #
</span><span class="cx"> # changeip script for calendar server
</span><span class="cx"> #
</span><del>-# Copyright (c) 2005-2013 Apple Inc.  All Rights Reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc.  All Rights Reserved.
</ins><span class="cx"> #
</span><span class="cx"> # IMPORTANT NOTE:  This file is licensed only for use on Apple-labeled
</span><span class="cx"> # computers and is subject to the terms and conditions of the Apple
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolscmdlinepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/cmdline.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/cmdline.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/cmdline.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsconfigpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/config.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/config.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/config.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsdbinspectpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/dbinspect.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/dbinspect.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/dbinspect.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> # -*- test-case-name: calendarserver.tools.test.test_calverify -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -37,8 +37,8 @@
</span><span class="cx"> from twistedcaldav.datafilters.peruserdata import PerUserDataFilter
</span><span class="cx"> from twistedcaldav.directory import calendaruserproxy
</span><span class="cx"> from twistedcaldav.directory.directory import DirectoryService
</span><del>-from twistedcaldav.query import calendarqueryfilter
</del><span class="cx"> from twistedcaldav.stdconfig import DEFAULT_CONFIG_FILE
</span><ins>+from txdav.caldav.datastore.query.filter import Filter
</ins><span class="cx"> from txdav.common.datastore.sql_tables import schema, _BIND_MODE_OWN
</span><span class="cx"> from uuid import UUID
</span><span class="cx"> import os
</span><span class="lines">@@ -757,10 +757,10 @@
</span><span class="cx">                           name=&quot;VCALENDAR&quot;,
</span><span class="cx">                        )
</span><span class="cx">                   )
</span><del>-        filter = calendarqueryfilter.Filter(filter)
</del><ins>+        filter = Filter(filter)
</ins><span class="cx">         filter.settimezone(None)
</span><span class="cx"> 
</span><del>-        matches = yield calendar._index.indexedSearch(filter, useruid=uid, fbtype=False)
</del><ins>+        matches = yield calendar.search(filter, useruid=uid, fbtype=False)
</ins><span class="cx">         if matches is None:
</span><span class="cx">             returnValue(None)
</span><span class="cx">         for name, _ignore_uid, _ignore_type in matches:
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsdkimtoolpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/dkimtool.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/dkimtool.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/dkimtool.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsexportpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/export.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/export.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/export.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> # -*- test-case-name: calendarserver.tools.test.test_export -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsgatewaypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/gateway.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/gateway.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/gateway.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsicalsplitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/icalsplit.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/icalsplit.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/icalsplit.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsloadaugmentdbpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/loadaugmentdb.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/loadaugmentdb.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/loadaugmentdb.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsmanagepostgrespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/managepostgres.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/managepostgres.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/managepostgres.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsmanagetimezonespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/managetimezones.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/managetimezones.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/managetimezones.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsmigratepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/migrate.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/migrate.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/migrate.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsmigrate_verifypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/migrate_verify.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/migrate_verify.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/migrate_verify.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> # -*- test-case-name: calendarserver.tools.test.test_calverify -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsnotificationspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/notifications.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/notifications.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/notifications.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsobliteratepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/obliterate.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/obliterate.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/obliterate.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> # -*- test-case-name: calendarserver.tools.test.test_calverify -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsprincipalspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/principals.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/principals.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/principals.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolspurgepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/purge.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/purge.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/purge.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> # -*- test-case-name: calendarserver.tools.test.test_purge -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -30,10 +30,9 @@
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> 
</span><span class="cx"> from twistedcaldav import caldavxml
</span><del>-from twistedcaldav.caldavxml import TimeRange
</del><span class="cx"> from twistedcaldav.directory.directory import DirectoryRecord
</span><del>-from twistedcaldav.query import calendarqueryfilter
</del><span class="cx"> 
</span><ins>+from txdav.caldav.datastore.query.filter import Filter
</ins><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -817,13 +816,13 @@
</span><span class="cx">         query_filter = caldavxml.Filter(
</span><span class="cx">               caldavxml.ComponentFilter(
</span><span class="cx">                   caldavxml.ComponentFilter(
</span><del>-                      TimeRange(start=whenString,),
</del><ins>+                      caldavxml.TimeRange(start=whenString,),
</ins><span class="cx">                       name=(&quot;VEVENT&quot;,),
</span><span class="cx">                   ),
</span><span class="cx">                   name=&quot;VCALENDAR&quot;,
</span><span class="cx">                )
</span><span class="cx">           )
</span><del>-        query_filter = calendarqueryfilter.Filter(query_filter)
</del><ins>+        query_filter = Filter(query_filter)
</ins><span class="cx"> 
</span><span class="cx">         count = 0
</span><span class="cx">         txn = self.store.newTransaction()
</span><span class="lines">@@ -844,7 +843,7 @@
</span><span class="cx">                     childNames.append(childName)
</span><span class="cx">             else:
</span><span class="cx">                 # events matching filter
</span><del>-                for childName, _ignore_childUid, _ignore_childType in (yield calendar._index.indexedSearch(query_filter)):
</del><ins>+                for childName, _ignore_childUid, _ignore_childType in (yield calendar.search(query_filter)):
</ins><span class="cx">                     childNames.append(childName)
</span><span class="cx">             yield txn.commit()
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolspushpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/push.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/push.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/push.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsresourcespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/resources.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/resources.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/resources.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsshell__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsshellcmdpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/cmd.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/cmd.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/cmd.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsshelldirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/directory.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/directory.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/directory.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsshellterminalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/terminal.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/terminal.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/terminal.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsshelltest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsshelltesttest_cmdpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/test/test_cmd.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/test/test_cmd.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/test/test_cmd.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsshelltesttest_vfspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/test/test_vfs.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/test/test_vfs.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/test/test_vfs.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -28,45 +28,55 @@
</span><span class="cx"> 
</span><span class="cx"> class TestListEntry(TestCase):
</span><span class="cx">     def test_toString(self):
</span><del>-        self.assertEquals(ListEntry(None, File  , &quot;thingo&quot;           ).toString(), &quot;thingo&quot; )
-        self.assertEquals(ListEntry(None, File  , &quot;thingo&quot;, Foo=&quot;foo&quot;).toString(), &quot;thingo&quot; )
-        self.assertEquals(ListEntry(None, Folder, &quot;thingo&quot;           ).toString(), &quot;thingo/&quot;)
</del><ins>+        self.assertEquals(ListEntry(None, File  , &quot;thingo&quot;).toString(), &quot;thingo&quot;)
+        self.assertEquals(ListEntry(None, File  , &quot;thingo&quot;, Foo=&quot;foo&quot;).toString(), &quot;thingo&quot;)
+        self.assertEquals(ListEntry(None, Folder, &quot;thingo&quot;).toString(), &quot;thingo/&quot;)
</ins><span class="cx">         self.assertEquals(ListEntry(None, Folder, &quot;thingo&quot;, Foo=&quot;foo&quot;).toString(), &quot;thingo/&quot;)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def test_fieldNamesImplicit(self):
</span><span class="cx">         # This test assumes File doesn't set list.fieldNames.
</span><span class="cx">         assert not hasattr(File.list, &quot;fieldNames&quot;)
</span><span class="cx"> 
</span><span class="cx">         self.assertEquals(set(ListEntry(File(None, ()), File, &quot;thingo&quot;).fieldNames), set((&quot;Name&quot;,)))
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def test_fieldNamesExplicit(self):
</span><span class="cx">         def fieldNames(fileClass):
</span><span class="cx">             return ListEntry(fileClass(None, ()), fileClass, &quot;thingo&quot;, Flavor=&quot;Coconut&quot;, Style=&quot;Hard&quot;)
</span><span class="cx"> 
</span><span class="cx">         # Full list
</span><del>-        class MyFile(File):
-            def list(self): return succeed(())
</del><ins>+        class MyFile1(File):
+            def list(self):
+                return succeed(())
</ins><span class="cx">             list.fieldNames = (&quot;Name&quot;, &quot;Flavor&quot;)
</span><del>-        self.assertEquals(fieldNames(MyFile).fieldNames, (&quot;Name&quot;, &quot;Flavor&quot;))
</del><ins>+        self.assertEquals(fieldNames(MyFile1).fieldNames, (&quot;Name&quot;, &quot;Flavor&quot;))
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx">         # Full list, different order
</span><del>-        class MyFile(File):
-            def list(self): return succeed(())
</del><ins>+        class MyFile2(File):
+            def list(self):
+                return succeed(())
</ins><span class="cx">             list.fieldNames = (&quot;Flavor&quot;, &quot;Name&quot;)
</span><del>-        self.assertEquals(fieldNames(MyFile).fieldNames, (&quot;Flavor&quot;, &quot;Name&quot;))
</del><ins>+        self.assertEquals(fieldNames(MyFile2).fieldNames, (&quot;Flavor&quot;, &quot;Name&quot;))
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx">         # Omits Name, which is implicitly added
</span><del>-        class MyFile(File):
-            def list(self): return succeed(())
</del><ins>+        class MyFile3(File):
+            def list(self):
+                return succeed(())
</ins><span class="cx">             list.fieldNames = (&quot;Flavor&quot;,)
</span><del>-        self.assertEquals(fieldNames(MyFile).fieldNames, (&quot;Name&quot;, &quot;Flavor&quot;))
</del><ins>+        self.assertEquals(fieldNames(MyFile3).fieldNames, (&quot;Name&quot;, &quot;Flavor&quot;))
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx">         # Emtpy
</span><del>-        class MyFile(File):
-            def list(self): return succeed(())
</del><ins>+        class MyFile4(File):
+            def list(self):
+                return succeed(())
</ins><span class="cx">             list.fieldNames = ()
</span><del>-        self.assertEquals(fieldNames(MyFile).fieldNames, (&quot;Name&quot;,))
</del><ins>+        self.assertEquals(fieldNames(MyFile4).fieldNames, (&quot;Name&quot;,))
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def test_toFieldsImplicit(self):
</span><span class="cx">         # This test assumes File doesn't set list.fieldNames.
</span><span class="cx">         assert not hasattr(File.list, &quot;fieldNames&quot;)
</span><span class="lines">@@ -77,33 +87,41 @@
</span><span class="cx">             (&quot;thingo&quot;, &quot;Coconut&quot;, &quot;Hard&quot;)
</span><span class="cx">         )
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def test_toFieldsExplicit(self):
</span><span class="cx">         def fields(fileClass):
</span><span class="cx">             return tuple(ListEntry(fileClass(None, ()), fileClass, &quot;thingo&quot;, Flavor=&quot;Coconut&quot;, Style=&quot;Hard&quot;).toFields())
</span><span class="cx"> 
</span><span class="cx">         # Full list
</span><del>-        class MyFile(File):
-            def list(self): return succeed(())
</del><ins>+        class MyFile1(File):
+            def list(self):
+                return succeed(())
</ins><span class="cx">             list.fieldNames = (&quot;Name&quot;, &quot;Flavor&quot;)
</span><del>-        self.assertEquals(fields(MyFile), (&quot;thingo&quot;, &quot;Coconut&quot;))
</del><ins>+        self.assertEquals(fields(MyFile1), (&quot;thingo&quot;, &quot;Coconut&quot;))
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx">         # Full list, different order
</span><del>-        class MyFile(File):
-            def list(self): return succeed(())
</del><ins>+        class MyFile2(File):
+            def list(self):
+                return succeed(())
</ins><span class="cx">             list.fieldNames = (&quot;Flavor&quot;, &quot;Name&quot;)
</span><del>-        self.assertEquals(fields(MyFile), (&quot;Coconut&quot;, &quot;thingo&quot;))
</del><ins>+        self.assertEquals(fields(MyFile2), (&quot;Coconut&quot;, &quot;thingo&quot;))
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx">         # Omits Name, which is implicitly added
</span><del>-        class MyFile(File):
-            def list(self): return succeed(())
</del><ins>+        class MyFile3(File):
+            def list(self):
+                return succeed(())
</ins><span class="cx">             list.fieldNames = (&quot;Flavor&quot;,)
</span><del>-        self.assertEquals(fields(MyFile), (&quot;thingo&quot;, &quot;Coconut&quot;))
</del><ins>+        self.assertEquals(fields(MyFile3), (&quot;thingo&quot;, &quot;Coconut&quot;))
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx">         # Emtpy
</span><del>-        class MyFile(File):
-            def list(self): return succeed(())
</del><ins>+        class MyFile4(File):
+            def list(self):
+                return succeed(())
</ins><span class="cx">             list.fieldNames = ()
</span><del>-        self.assertEquals(fields(MyFile), (&quot;thingo&quot;,))
</del><ins>+        self.assertEquals(fields(MyFile4), (&quot;thingo&quot;,))
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -114,6 +132,7 @@
</span><span class="cx">     def __init__(self, testCase):
</span><span class="cx">         self.testCase = testCase
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def mktemp(self):
</span><span class="cx">         return self.testCase.mktemp()
</span><span class="cx"> 
</span><span class="lines">@@ -129,8 +148,9 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Create a L{UIDsFolder}.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        self.svc = ShellService(store=(yield buildStore(self, None)),
-                                directory=DirectoryStubber(self).service(),
</del><ins>+        directory = DirectoryStubber(self).service()
+        self.svc = ShellService(store=(yield buildStore(self, None, directoryService=directory)),
+                                directory=directory,
</ins><span class="cx">                                 options=None, reactor=None, config=None)
</span><span class="cx">         self.folder = UIDsFolder(self.svc, ())
</span><span class="cx"> 
</span><span class="lines">@@ -156,6 +176,3 @@
</span><span class="cx">               {&quot;Record Type&quot;: &quot;users&quot;, &quot;Short Name&quot;: &quot;dreid&quot;,
</span><span class="cx">               &quot;Full Name&quot;: &quot;David Reid&quot;, &quot;Name&quot;: dreid}]
</span><span class="cx">         )
</span><del>-
-
-
</del></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsshellvfspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/vfs.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/vfs.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/shell/vfs.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: calendarserver.tools.shell.test.test_vfs -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstablespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/tables.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/tables.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/tables.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestcalverifyaccountsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/calverify/accounts.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/calverify/accounts.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/calverify/accounts.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span><span class="lines">@@ -47,4 +47,11 @@
</span><span class="cx">     &lt;name&gt;Example User4&lt;/name&gt;
</span><span class="cx">     &lt;email-address&gt;example4@example.com&lt;/email-address&gt;
</span><span class="cx">   &lt;/user&gt;
</span><ins>+  &lt;user&gt;
+    &lt;uid&gt;home1&lt;/uid&gt;
+    &lt;guid&gt;home1&lt;/guid&gt;
+    &lt;password&gt;home1&lt;/password&gt;
+    &lt;name&gt;Home 1&lt;/name&gt;
+    &lt;email-address&gt;home1@example.com&lt;/email-address&gt;
+  &lt;/user&gt;
</ins><span class="cx"> &lt;/accounts&gt;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestcalverifyaugmentsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/calverify/augments.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/calverify/augments.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/calverify/augments.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestdeprovisionaugmentsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/deprovision/augments.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/deprovision/augments.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/deprovision/augments.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestdeprovisioncaldavdplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/deprovision/caldavd.plist (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/deprovision/caldavd.plist        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/deprovision/caldavd.plist        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-    Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+    Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx">     Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx">     you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestdeprovisionresourceslocationsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/deprovision/resources-locations.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/deprovision/resources-locations.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/deprovision/resources-locations.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestdeprovisionusersgroupsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/deprovision/users-groups.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/deprovision/users-groups.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/deprovision/users-groups.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestgatewayaugmentsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/gateway/augments.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/gateway/augments.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/gateway/augments.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestgatewaycaldavdplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/gateway/caldavd.plist (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/gateway/caldavd.plist        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/gateway/caldavd.plist        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-    Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+    Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx">     Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx">     you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestgatewayresourceslocationsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/gateway/resources-locations.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/gateway/resources-locations.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/gateway/resources-locations.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestgatewayusersgroupsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/gateway/users-groups.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/gateway/users-groups.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/gateway/users-groups.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestprincipalsaugmentsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/principals/augments.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/principals/augments.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/principals/augments.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestprincipalscaldavdplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/principals/caldavd.plist (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/principals/caldavd.plist        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/principals/caldavd.plist        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-    Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+    Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx">     Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx">     you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestprincipalsresourceslocationsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/principals/resources-locations.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/principals/resources-locations.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/principals/resources-locations.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestprincipalsusersgroupsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/principals/users-groups.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/principals/users-groups.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/principals/users-groups.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstestpurgeaccountsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/purge/accounts.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/purge/accounts.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/purge/accounts.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span><span class="lines">@@ -26,4 +26,25 @@
</span><span class="cx">     &lt;name&gt;Example User&lt;/name&gt;
</span><span class="cx">     &lt;email-address&gt;example@example.com&lt;/email-address&gt;
</span><span class="cx">   &lt;/user&gt;
</span><ins>+  &lt;user&gt;
+    &lt;uid&gt;example2&lt;/uid&gt;
+    &lt;guid&gt;37DB0C90-4DB1-4932-BC69-3DAB66F374F5&lt;/guid&gt;
+    &lt;password&gt;example2&lt;/password&gt;
+    &lt;name&gt;Example User 2&lt;/name&gt;
+    &lt;email-address&gt;example2@example.com&lt;/email-address&gt;
+  &lt;/user&gt;
+  &lt;user&gt;
+    &lt;uid&gt;home1&lt;/uid&gt;
+    &lt;guid&gt;home1&lt;/guid&gt;
+    &lt;password&gt;home1&lt;/password&gt;
+    &lt;name&gt;Home 1&lt;/name&gt;
+    &lt;email-address&gt;home1@example.com&lt;/email-address&gt;
+  &lt;/user&gt;
+  &lt;user&gt;
+    &lt;uid&gt;home2&lt;/uid&gt;
+    &lt;guid&gt;home2&lt;/guid&gt;
+    &lt;password&gt;home2&lt;/password&gt;
+    &lt;name&gt;Home 2&lt;/name&gt;
+    &lt;email-address&gt;home2@example.com&lt;/email-address&gt;
+  &lt;/user&gt;
</ins><span class="cx"> &lt;/accounts&gt;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_agentpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_agent.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_agent.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_agent.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_calverifypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_calverify.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_calverify.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_calverify.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -20,7 +20,8 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx"> from calendarserver.tools.calverify import BadDataService, \
</span><del>-    SchedulingMismatchService, DoubleBookingService, DarkPurgeService
</del><ins>+    SchedulingMismatchService, DoubleBookingService, DarkPurgeService, \
+    EventSplitService
</ins><span class="cx"> 
</span><span class="cx"> from pycalendar.datetime import DateTime
</span><span class="cx"> 
</span><span class="lines">@@ -28,6 +29,7 @@
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> 
</span><span class="cx"> from twistedcaldav.config import config
</span><ins>+from twistedcaldav.ical import normalize_iCalStr
</ins><span class="cx"> from twistedcaldav.test.util import StoreTestCase
</span><span class="cx"> 
</span><span class="cx"> from txdav.common.datastore.test.util import populateCalendarsFrom
</span><span class="lines">@@ -2806,3 +2808,323 @@
</span><span class="cx">         self.assertEqual(len(calverify.results[&quot;Dark Events&quot;]), 0)
</span><span class="cx">         self.assertTrue(&quot;Fix dark events&quot; not in calverify.results)
</span><span class="cx">         self.assertTrue(&quot;Fix remove&quot; not in calverify.results)
</span><ins>+
+
+
+class CalVerifyEventPurge(CalVerifyMismatchTestsBase):
+    &quot;&quot;&quot;
+    Tests calverify for events.
+    &quot;&quot;&quot;
+
+    # No organizer
+    NO_ORGANIZER_ICS = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.1//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+CREATED:20100303T181216Z
+UID:INVITE_NO_ORGANIZER_ICS
+TRANSP:OPAQUE
+SUMMARY:INVITE_NO_ORGANIZER_ICS
+DTSTART:%(now_fwd10)s
+DURATION:PT1H
+DTSTAMP:20100303T181220Z
+SEQUENCE:2
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
+
+    # Valid organizer
+    VALID_ORGANIZER_ICS = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.1//EN
+BEGIN:VEVENT
+UID:INVITE_VALID_ORGANIZER_ICS
+DTSTART:%(now)s
+DURATION:PT1H
+ATTENDEE:urn:uuid:%(uuid1)s
+ATTENDEE:urn:uuid:%(uuid2)s
+ORGANIZER:urn:uuid:%(uuid1)s
+RRULE:FREQ=DAILY
+SUMMARY:INVITE_VALID_ORGANIZER_ICS
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
+
+    # Valid attendee
+    VALID_ATTENDEE_ICS = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.1//EN
+BEGIN:VEVENT
+UID:INVITE_VALID_ORGANIZER_ICS
+DTSTART:%(now)s
+DURATION:PT1H
+ATTENDEE:urn:uuid:%(uuid1)s
+ATTENDEE:urn:uuid:%(uuid2)s
+ORGANIZER:urn:uuid:%(uuid1)s
+RRULE:FREQ=DAILY
+SUMMARY:INVITE_VALID_ORGANIZER_ICS
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
+
+    # Valid organizer
+    VALID_ORGANIZER_FUTURE_ICS = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.1//EN
+BEGIN:VEVENT
+UID:INVITE_VALID_ORGANIZER_ICS
+DTSTART:%(now_fwd11)s
+DURATION:PT1H
+ATTENDEE:urn:uuid:%(uuid1)s
+ATTENDEE:urn:uuid:%(uuid2)s
+ORGANIZER:urn:uuid:%(uuid1)s
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY
+SEQUENCE:1
+SUMMARY:INVITE_VALID_ORGANIZER_ICS
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
+
+    # Valid attendee
+    VALID_ATTENDEE_FUTURE_ICS = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.1//EN
+BEGIN:VEVENT
+UID:INVITE_VALID_ORGANIZER_ICS
+DTSTART:%(now_fwd11)s
+DURATION:PT1H
+ATTENDEE:urn:uuid:%(uuid1)s
+ATTENDEE:urn:uuid:%(uuid2)s
+ORGANIZER:urn:uuid:%(uuid1)s
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY
+SEQUENCE:1
+SUMMARY:INVITE_VALID_ORGANIZER_ICS
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
+
+    # Valid organizer
+    VALID_ORGANIZER_PAST_ICS = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.1//EN
+BEGIN:VEVENT
+UID:%(relID)s
+DTSTART:%(now)s
+DURATION:PT1H
+ATTENDEE:urn:uuid:%(uuid1)s
+ATTENDEE:urn:uuid:%(uuid2)s
+ORGANIZER:urn:uuid:%(uuid1)s
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY;UNTIL=%(now_fwd11_1)s
+SEQUENCE:1
+SUMMARY:INVITE_VALID_ORGANIZER_ICS
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
+
+    # Valid attendee
+    VALID_ATTENDEE_PAST_ICS = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.1//EN
+BEGIN:VEVENT
+UID:%(relID)s
+DTSTART:%(now)s
+DURATION:PT1H
+ATTENDEE:urn:uuid:%(uuid1)s
+ATTENDEE:urn:uuid:%(uuid2)s
+ORGANIZER:urn:uuid:%(uuid1)s
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY;UNTIL=%(now_fwd11_1)s
+SEQUENCE:1
+SUMMARY:INVITE_VALID_ORGANIZER_ICS
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
+
+    # Valid organizer
+    VALID_ORGANIZER_OVERRIDE_ICS = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.1//EN
+BEGIN:VEVENT
+UID:VALID_ORGANIZER_OVERRIDE_ICS
+DTSTART:%(now)s
+DURATION:PT1H
+ATTENDEE:urn:uuid:%(uuid1)s
+ATTENDEE:urn:uuid:%(uuid2)s
+ORGANIZER:urn:uuid:%(uuid1)s
+RRULE:FREQ=DAILY
+SUMMARY:INVITE_VALID_ORGANIZER_ICS
+END:VEVENT
+BEGIN:VEVENT
+UID:VALID_ORGANIZER_OVERRIDE_ICS
+RECURRENCE-ID:%(now_fwd11)s
+DTSTART:%(now_fwd11)s
+DURATION:PT2H
+ATTENDEE:urn:uuid:%(uuid1)s
+ATTENDEE:urn:uuid:%(uuid2)s
+ORGANIZER:urn:uuid:%(uuid1)s
+RRULE:FREQ=DAILY
+SUMMARY:INVITE_VALID_ORGANIZER_ICS
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
+
+    @inlineCallbacks
+    def setUp(self):
+
+        self.subs = {
+            &quot;uuid1&quot; : CalVerifyMismatchTestsBase.uuid1,
+            &quot;uuid2&quot; : CalVerifyMismatchTestsBase.uuid2,
+        }
+
+        self.now = DateTime.getNowUTC()
+        self.now.setHHMMSS(0, 0, 0)
+
+        self.subs[&quot;now&quot;] = self.now
+
+        for i in range(30):
+            attrname = &quot;now_back%s&quot; % (i + 1,)
+            setattr(self, attrname, self.now.duplicate())
+            getattr(self, attrname).offsetDay(-(i + 1))
+            self.subs[attrname] = getattr(self, attrname)
+
+            attrname_12h = &quot;now_back%s_12h&quot; % (i + 1,)
+            setattr(self, attrname_12h, getattr(self, attrname).duplicate())
+            getattr(self, attrname_12h).offsetHours(12)
+            self.subs[attrname_12h] = getattr(self, attrname_12h)
+
+            attrname_1 = &quot;now_back%s_1&quot; % (i + 1,)
+            setattr(self, attrname_1, getattr(self, attrname).duplicate())
+            getattr(self, attrname_1).offsetSeconds(-1)
+            self.subs[attrname_1] = getattr(self, attrname_1)
+
+        for i in range(30):
+            attrname = &quot;now_fwd%s&quot; % (i + 1,)
+            setattr(self, attrname, self.now.duplicate())
+            getattr(self, attrname).offsetDay(i + 1)
+            self.subs[attrname] = getattr(self, attrname)
+
+            attrname_12h = &quot;now_fwd%s_12h&quot; % (i + 1,)
+            setattr(self, attrname_12h, getattr(self, attrname).duplicate())
+            getattr(self, attrname_12h).offsetHours(12)
+            self.subs[attrname_12h] = getattr(self, attrname_12h)
+
+            attrname_1 = &quot;now_fwd%s_1&quot; % (i + 1,)
+            setattr(self, attrname_1, getattr(self, attrname).duplicate())
+            getattr(self, attrname_1).offsetSeconds(-1)
+            self.subs[attrname_1] = getattr(self, attrname_1)
+
+        self.requirements = {
+            CalVerifyMismatchTestsBase.uuid1 : {
+                &quot;calendar&quot; : {
+                    &quot;invite1.ics&quot; : (self.NO_ORGANIZER_ICS % self.subs, CalVerifyMismatchTestsBase.metadata,),
+                    &quot;invite2.ics&quot; : (self.VALID_ORGANIZER_ICS % self.subs, CalVerifyMismatchTestsBase.metadata,),
+                    &quot;invite3.ics&quot; : (self.VALID_ORGANIZER_OVERRIDE_ICS % self.subs, CalVerifyMismatchTestsBase.metadata,),
+                },
+                &quot;inbox&quot; : {},
+            },
+            CalVerifyMismatchTestsBase.uuid2 : {
+                &quot;calendar&quot; : {
+                    &quot;invite2a.ics&quot; : (self.VALID_ATTENDEE_ICS % self.subs, CalVerifyMismatchTestsBase.metadata,),
+                },
+                &quot;inbox&quot; : {},
+            },
+            CalVerifyMismatchTestsBase.uuid3 : {
+                &quot;calendar&quot; : {},
+                &quot;inbox&quot; : {},
+            },
+            CalVerifyMismatchTestsBase.uuidl1 : {
+                &quot;calendar&quot; : {},
+                &quot;inbox&quot; : {},
+            },
+        }
+
+        yield super(CalVerifyEventPurge, self).setUp()
+
+
+    @inlineCallbacks
+    def test_validSplit(self):
+        &quot;&quot;&quot;
+        CalVerifyService.doScan without fix for dark events. Make sure it detects
+        as much as it can. Make sure sync-token is not changed.
+        &quot;&quot;&quot;
+
+        options = {
+            &quot;nuke&quot;: False,
+            &quot;missing&quot;: False,
+            &quot;ical&quot;: False,
+            &quot;mismatch&quot;: False,
+            &quot;double&quot;: True,
+            &quot;dark-purge&quot;: False,
+            &quot;split&quot;: True,
+            &quot;path&quot;: &quot;/calendars/__uids__/%(uuid1)s/calendar/invite2.ics&quot; % self.subs,
+            &quot;rid&quot;: &quot;%(now_fwd11)s&quot; % self.subs,
+            &quot;summary&quot;: False,
+        }
+        output = StringIO()
+        calverify = EventSplitService(self._sqlCalendarStore, options, output, reactor, config)
+        oldObj = yield calverify.doAction()
+        oldUID = oldObj.uid()
+
+        relsubs = dict(self.subs)
+        relsubs[&quot;relID&quot;] = oldUID
+
+        calendar = yield self.calendarUnderTest(home=CalVerifyMismatchTestsBase.uuid1, name=&quot;calendar&quot;)
+        objs = yield calendar.listObjectResources()
+        self.assertEqual(len(objs), 4)
+        self.assertTrue(&quot;invite2.ics&quot; in objs)
+        oldName = filter(lambda x: not x.startswith(&quot;invite&quot;), objs)[0]
+
+        obj1 = yield calendar.objectResourceWithName(&quot;invite2.ics&quot;)
+        ical1 = yield obj1.component()
+        self.assertEqual(normalize_iCalStr(ical1), self.VALID_ORGANIZER_FUTURE_ICS % relsubs)
+
+        obj2 = yield calendar.objectResourceWithName(oldName)
+        ical2 = yield obj2.component()
+        self.assertEqual(normalize_iCalStr(ical2), self.VALID_ORGANIZER_PAST_ICS % relsubs)
+
+        calendar = yield self.calendarUnderTest(home=CalVerifyMismatchTestsBase.uuid2, name=&quot;calendar&quot;)
+        objs = yield calendar.listObjectResources()
+        self.assertEqual(len(objs), 2)
+        self.assertTrue(&quot;invite2a.ics&quot; in objs)
+        oldName = filter(lambda x: not x.startswith(&quot;invite&quot;), objs)[0]
+
+        obj1 = yield calendar.objectResourceWithName(&quot;invite2a.ics&quot;)
+        ical1 = yield obj1.component()
+        self.assertEqual(normalize_iCalStr(ical1), self.VALID_ATTENDEE_FUTURE_ICS % relsubs)
+
+        obj2 = yield calendar.objectResourceWithName(oldName)
+        ical2 = yield obj2.component()
+        self.assertEqual(normalize_iCalStr(ical2), self.VALID_ATTENDEE_PAST_ICS % relsubs)
+
+
+    @inlineCallbacks
+    def test_summary(self):
+        &quot;&quot;&quot;
+        CalVerifyService.doScan without fix for dark events. Make sure it detects
+        as much as it can. Make sure sync-token is not changed.
+        &quot;&quot;&quot;
+
+        options = {
+            &quot;nuke&quot;: False,
+            &quot;missing&quot;: False,
+            &quot;ical&quot;: False,
+            &quot;mismatch&quot;: False,
+            &quot;double&quot;: True,
+            &quot;dark-purge&quot;: False,
+            &quot;split&quot;: True,
+            &quot;path&quot;: &quot;/calendars/__uids__/%(uuid1)s/calendar/invite3.ics&quot; % self.subs,
+            &quot;rid&quot;: &quot;%(now_fwd11)s&quot; % self.subs,
+            &quot;summary&quot;: True,
+        }
+        output = StringIO()
+        calverify = EventSplitService(self._sqlCalendarStore, options, output, reactor, config)
+        yield calverify.doAction()
+        result = output.getvalue().splitlines()
+        self.assertTrue(&quot;%(now)s&quot; % self.subs in result)
+        self.assertTrue(&quot;%(now_fwd10)s&quot; % self.subs in result)
+        self.assertTrue(&quot;%(now_fwd11)s *&quot; % self.subs in result)
+        self.assertTrue(&quot;%(now_fwd12)s&quot; % self.subs in result)
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_changeippy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_changeip.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_changeip.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_changeip.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_configpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_config.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_config.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_config.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_exportpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_export.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_export.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_export.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -277,7 +277,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         yield populateCalendarsFrom(
</span><span class="cx">             {
</span><del>-                &quot;home1&quot;: {
</del><ins>+                &quot;user01&quot;: {
</ins><span class="cx">                     &quot;calendar1&quot;: {
</span><span class="cx">                         &quot;valentines-day.ics&quot;: (valentines, {})
</span><span class="cx">                     }
</span><span class="lines">@@ -291,7 +291,7 @@
</span><span class="cx"> 
</span><span class="cx">         io = StringIO()
</span><span class="cx">         yield exportToFile(
</span><del>-            [(yield self.txn().calendarHomeWithUID(&quot;home1&quot;))
</del><ins>+            [(yield self.txn().calendarHomeWithUID(&quot;user01&quot;))
</ins><span class="cx">               .calendarWithName(&quot;calendar1&quot;)], io
</span><span class="cx">         )
</span><span class="cx">         self.assertEquals(Component.fromString(io.getvalue()),
</span><span class="lines">@@ -306,7 +306,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         yield populateCalendarsFrom(
</span><span class="cx">             {
</span><del>-                &quot;home1&quot;: {
</del><ins>+                &quot;user01&quot;: {
</ins><span class="cx">                     &quot;calendar1&quot;: {
</span><span class="cx">                         &quot;valentines-day.ics&quot;: (valentines, {}),
</span><span class="cx">                         &quot;new-years-day.ics&quot;: (newYears, {})
</span><span class="lines">@@ -324,7 +324,7 @@
</span><span class="cx"> 
</span><span class="cx">         io = StringIO()
</span><span class="cx">         yield exportToFile(
</span><del>-            [(yield self.txn().calendarHomeWithUID(&quot;home1&quot;))
</del><ins>+            [(yield self.txn().calendarHomeWithUID(&quot;user01&quot;))
</ins><span class="cx">               .calendarWithName(&quot;calendar1&quot;)], io
</span><span class="cx">         )
</span><span class="cx">         self.assertEquals(Component.fromString(io.getvalue()),
</span><span class="lines">@@ -342,7 +342,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         yield populateCalendarsFrom(
</span><span class="cx">             {
</span><del>-                &quot;home1&quot;: {
</del><ins>+                &quot;user01&quot;: {
</ins><span class="cx">                     &quot;calendar1&quot;: {
</span><span class="cx">                         &quot;1.ics&quot;: (one, {}), # EST
</span><span class="cx">                         &quot;2.ics&quot;: (another, {}), # EST
</span><span class="lines">@@ -354,7 +354,7 @@
</span><span class="cx"> 
</span><span class="cx">         io = StringIO()
</span><span class="cx">         yield exportToFile(
</span><del>-            [(yield self.txn().calendarHomeWithUID(&quot;home1&quot;))
</del><ins>+            [(yield self.txn().calendarHomeWithUID(&quot;user01&quot;))
</ins><span class="cx">               .calendarWithName(&quot;calendar1&quot;)], io
</span><span class="cx">         )
</span><span class="cx">         result = Component.fromString(io.getvalue())
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_gatewaypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_gateway.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_gateway.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_gateway.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_principalspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_principals.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_principals.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_principals.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_purgepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_purge.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_purge.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_purge.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -806,16 +806,6 @@
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><del>-        self.patch(config.DirectoryService.params, &quot;xmlFile&quot;,
-            os.path.join(
-                os.path.dirname(__file__), &quot;purge&quot;, &quot;accounts.xml&quot;
-            )
-        )
-        self.patch(config.ResourceService.params, &quot;xmlFile&quot;,
-            os.path.join(
-                os.path.dirname(__file__), &quot;purge&quot;, &quot;resources.xml&quot;
-            )
-        )
</del><span class="cx">         yield super(PurgePrincipalTests, self).setUp()
</span><span class="cx"> 
</span><span class="cx">         txn = self._sqlCalendarStore.newTransaction()
</span><span class="lines">@@ -850,6 +840,20 @@
</span><span class="cx">         (yield txn.commit())
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def configure(self):
+        super(PurgePrincipalTests, self).configure()
+        self.patch(config.DirectoryService.params, &quot;xmlFile&quot;,
+            os.path.join(
+                os.path.dirname(__file__), &quot;purge&quot;, &quot;accounts.xml&quot;
+            )
+        )
+        self.patch(config.ResourceService.params, &quot;xmlFile&quot;,
+            os.path.join(
+                os.path.dirname(__file__), &quot;purge&quot;, &quot;resources.xml&quot;
+            )
+        )
+
+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def populate(self):
</span><span class="cx">         yield populateCalendarsFrom(self.requirements, self.storeUnderTest())
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_purge_old_eventspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_purge_old_events.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_purge_old_events.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_purge_old_events.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_resourcespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_resources.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_resources.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_resources.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolstesttest_utilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/test/test_util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsupgradepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/upgrade.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/upgrade.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/upgrade.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> # -*- test-case-name: calendarserver.tools.test.test_upgrade -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsvalidcalendardatapy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/validcalendardata.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/validcalendardata.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/validcalendardata.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarservertoolsworkitemspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/workitems.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/workitems.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/tools/workitems.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverwebadmin__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webadmin/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webadmin/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webadmin/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverwebadminresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webadmin/resource.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webadmin/resource.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webadmin/resource.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: calendarserver.webadmin.test.test_resource -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverwebadmintest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webadmin/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webadmin/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webadmin/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverwebadmintesttest_resourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webadmin/test/test_resource.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webadmin/test/test_resource.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webadmin/test/test_resource.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverwebcal__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webcal/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webcal/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webcal/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverwebcalresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webcal/resource.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webcal/resource.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webcal/resource.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverwebcaltest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webcal/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webcal/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webcal/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscalendarserverwebcaltesttest_resourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webcal/test/test_resource.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webcal/test/test_resource.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/calendarserver/webcal/test/test_resource.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfauthaccountstestxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/accounts-test.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/accounts-test.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/accounts-test.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfauthaccountsdtd"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/accounts.dtd (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/accounts.dtd        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/accounts.dtd        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfauthaccountsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/accounts.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/accounts.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/accounts.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfauthaugmentsdefaultxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/augments-default.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/augments-default.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/augments-default.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfauthaugmentsdtd"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/augments.dtd (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/augments.dtd        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/augments.dtd        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfauthproxiestestpodxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/proxies-test-pod.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/proxies-test-pod.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/proxies-test-pod.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfauthproxiestestxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/proxies-test.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/proxies-test.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/proxies-test.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfauthproxiesdtd"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/proxies.dtd (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/proxies.dtd        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/auth/proxies.dtd        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfcaldavdappleplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/caldavd-apple.plist (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/caldavd-apple.plist        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/caldavd-apple.plist        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-    Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+    Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx">     Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx">     you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfcaldavdtestpodBplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/caldavd-test-podB.plist (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/caldavd-test-podB.plist        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/caldavd-test-podB.plist        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -43,6 +43,13 @@
</span><span class="cx">     &lt;array&gt;
</span><span class="cx">     &lt;/array&gt;
</span><span class="cx"> 
</span><ins>+        &lt;!--  Work Queue --&gt;
+        &lt;key&gt;WorkQueue&lt;/key&gt;
+        &lt;dict&gt;
+                &lt;key&gt;ampPort&lt;/key&gt;
+                &lt;integer&gt;7655&lt;/integer&gt;
+        &lt;/dict&gt;
+
</ins><span class="cx">     &lt;!-- Server root --&gt;
</span><span class="cx">     &lt;key&gt;ServerRoot&lt;/key&gt;
</span><span class="cx">     &lt;string&gt;./data/podB&lt;/string&gt;
</span><span class="lines">@@ -94,6 +101,19 @@
</span><span class="cx">       &lt;/dict&gt;
</span><span class="cx">     &lt;/dict&gt;
</span><span class="cx"> 
</span><ins>+    &lt;!-- Sqlite ProxyDB Service - must use the same one as Pod A--&gt;
+    &lt;key&gt;ProxyDBService&lt;/key&gt;
+    &lt;dict&gt;
+      &lt;key&gt;type&lt;/key&gt;
+      &lt;string&gt;twistedcaldav.directory.calendaruserproxy.ProxySqliteDB&lt;/string&gt;
+      
+      &lt;key&gt;params&lt;/key&gt;
+      &lt;dict&gt;
+        &lt;key&gt;dbpath&lt;/key&gt;
+        &lt;string&gt;./data/podA/Data/proxies.sqlite&lt;/string&gt;
+      &lt;/dict&gt;
+    &lt;/dict&gt;
+
</ins><span class="cx">     &lt;key&gt;ProxyLoadFromFile&lt;/key&gt;
</span><span class="cx">     &lt;string&gt;./conf/auth/proxies-test-pod.xml&lt;/string&gt;
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfcaldavdtestplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/caldavd-test.plist (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/caldavd-test.plist        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/caldavd-test.plist        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-    Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+    Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx">     Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx">     you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfcaldavdplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/caldavd.plist (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/caldavd.plist        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/caldavd.plist        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-    Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+    Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx">     Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx">     you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconflocalserverstestxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/localservers-test.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/localservers-test.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/localservers-test.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconflocalserversdtd"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/localservers.dtd (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/localservers.dtd        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/localservers.dtd        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconflocalserversxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/localservers.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/localservers.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/localservers.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfremoteserverstestxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/remoteservers-test.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/remoteservers-test.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/remoteservers-test.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfremoteserversdtd"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/remoteservers.dtd (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/remoteservers.dtd        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/remoteservers.dtd        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfremoteserversxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/remoteservers.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/remoteservers.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/remoteservers.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfresourcescaldavdresourcesplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/resources/caldavd-resources.plist (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/resources/caldavd-resources.plist        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/resources/caldavd-resources.plist        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-    Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+    Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx">     Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx">     you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfresourceslocationsresourcesorigxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/resources/locations-resources-orig.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/resources/locations-resources-orig.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/resources/locations-resources-orig.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfresourceslocationsresourcesxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/resources/locations-resources.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/resources/locations-resources.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/resources/locations-resources.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfresourcesusersgroupsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/resources/users-groups.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/resources/users-groups.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/resources/users-groups.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconfresourcesxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/resources.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/resources.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/resources.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsconftestaccountsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/conf/test/accounts.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/conf/test/accounts.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/conf/test/accounts.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontrib__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontriblaunchdcalendarserverplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/launchd/calendarserver.plist (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/launchd/calendarserver.plist        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/launchd/calendarserver.plist        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformance__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformance_event_changepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/_event_change.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/_event_change.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/_event_change.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformance_event_createpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/_event_create.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/_event_create.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/_event_create.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchlibpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchlib.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchlib.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchlib.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchlibsh"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchlib.sh (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchlib.sh        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchlib.sh        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmark"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmark (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmark        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmark        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarkpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmark.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmark.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmark.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksbounded_recurrencepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/bounded_recurrence.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/bounded_recurrence.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/bounded_recurrence.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksbounded_recurrence_autoacceptpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/bounded_recurrence_autoaccept.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/bounded_recurrence_autoaccept.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/bounded_recurrence_autoaccept.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarkseventpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksevent_add_attendeepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_add_attendee.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_add_attendee.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_add_attendee.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksevent_autoacceptpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_autoaccept.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_autoaccept.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_autoaccept.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksevent_change_datepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_change_date.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_change_date.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_change_date.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksevent_change_summarypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_change_summary.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_change_summary.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_change_summary.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksevent_deletepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_delete.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_delete.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_delete.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksevent_delete_attendeepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_delete_attendee.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_delete_attendee.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_delete_attendee.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksevent_movepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_move.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_move.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/event_move.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksfind_calendarspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/find_calendars.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/find_calendars.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/find_calendars.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksfind_eventspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/find_events.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/find_events.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/find_events.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksunbounded_recurrencepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/unbounded_recurrence.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/unbounded_recurrence.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/unbounded_recurrence.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksunbounded_recurrence_autoacceptpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/unbounded_recurrence_autoaccept.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/unbounded_recurrence_autoaccept.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/unbounded_recurrence_autoaccept.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksvfreebusypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/vfreebusy.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/vfreebusy.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/vfreebusy.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancebenchmarksvfreebusy_vary_attendeespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/vfreebusy_vary_attendees.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/vfreebusy_vary_attendees.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/benchmarks/vfreebusy_vary_attendees.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancecompare"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/compare (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/compare        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/compare        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancecomparepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/compare.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/compare.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/compare.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancedisplaycalendareventspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/display-calendar-events.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/display-calendar-events.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/display-calendar-events.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceextractconf"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/extractconf (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/extractconf        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/extractconf        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancefixunitssql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/fix-units.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/fix-units.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/fix-units.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> --
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancegraph"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/graph (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/graph        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/graph        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancegraphpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/graph.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/graph.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/graph.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancehttpauthpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/httpauth.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/httpauth.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/httpauth.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancehttpclientpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/httpclient.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/httpclient.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/httpclient.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceio_measured"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/io_measure.d (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/io_measure.d        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/io_measure.d        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx">  * you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtestampsimpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/ampsim.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/ampsim.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/ampsim.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtestclientsplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/clients.plist (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/clients.plist        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/clients.plist        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-    Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+    Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx">     Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx">     you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtestconfigdistplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/config.dist.plist (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/config.dist.plist        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/config.dist.plist        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-    Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+    Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx">     Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx">     you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtestconfigplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/config.plist (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/config.plist        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/config.plist        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-    Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+    Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx">     Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx">     you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtesticalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/ical.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/ical.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/ical.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtestloggerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/logger.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/logger.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/logger.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtestpopulationpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/population.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/population.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/population.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: contrib.performance.loadtest.test_population -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtestprofilespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/profiles.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/profiles.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/profiles.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtestsimpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/sim.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/sim.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/sim.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: contrib.performance.loadtest.test_sim -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtesttest_icalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_ical.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_ical.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_ical.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtesttest_populationpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_population.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_population.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_population.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtesttest_profilespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_profiles.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_profiles.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_profiles.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtesttest_simpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_sim.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_sim.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_sim.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtesttest_trafficloggerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_trafficlogger.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_trafficlogger.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_trafficlogger.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtesttest_webadminpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_webadmin.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_webadmin.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/test_webadmin.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtesttrafficloggerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/trafficlogger.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/trafficlogger.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/trafficlogger.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceloadtestwebadminpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/webadmin.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/webadmin.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/loadtest/webadmin.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancemassupload"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/massupload (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/massupload        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/massupload        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancemassuploadpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/massupload.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/massupload.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/massupload.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancenightlysh"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/nightly.sh (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/nightly.sh        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/nightly.sh        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/bin/bash -x
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancepgsqld"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/pgsql.d (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/pgsql.d        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/pgsql.d        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx">  * you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceprofilesh"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/profile.sh (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/profile.sh        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/profile.sh        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/bin/bash -x
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancereport"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/report (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/report        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/report        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancereportpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/report.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/report.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/report.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancereport_principalspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/report_principals.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/report_principals.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/report_principals.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancereuploadsh"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/reupload.sh (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/reupload.sh        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/reupload.sh        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/bin/bash -x
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesamplemanysh"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sample-many.sh (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sample-many.sh        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sample-many.sh        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env bash
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesamplesh"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sample.sh (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sample.sh        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sample.sh        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env bash   
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesetbackend"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/setbackend (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/setbackend        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/setbackend        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesetbackendpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/setbackend.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/setbackend.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/setbackend.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesim"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sim (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sim        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sim        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesomemoredatash"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/some-more-data.sh (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/some-more-data.sh        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/some-more-data.sh        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/bin/bash -x
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancespeedcentertac"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/speedcenter.tac (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/speedcenter.tac        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/speedcenter.tac        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesql_measured"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sql_measure.d (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sql_measure.d        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sql_measure.d        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx">  * you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusage__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagerequests__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagerequestshttpTestspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/httpTests.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/httpTests.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/httpTests.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagerequestsinvitepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/invite.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/invite.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/invite.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagerequestsmultigetpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/multiget.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/multiget.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/multiget.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagerequestspropfindpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/propfind.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/propfind.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/propfind.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagerequestspropfind_invitepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/propfind_invite.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/propfind_invite.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/propfind_invite.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagerequestsputpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/put.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/put.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/put.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagerequestsquerypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/query.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/query.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/query.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagerequestssyncpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/sync.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/sync.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/requests/sync.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlusagesqlusagepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/sqlusage.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/sqlusage.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlusage/sqlusage.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlwatch"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlwatch (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlwatch        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlwatch        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesqlwatchpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlwatch.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlwatch.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sqlwatch.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancestackedbarpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/stackedbar.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/stackedbar.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/stackedbar.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancestatspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/stats.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/stats.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/stats.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesudorunsh"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sudo-run.sh (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sudo-run.sh        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/sudo-run.sh        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env bash
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesvncommittime"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/svn-committime (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/svn-committime        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/svn-committime        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancesvnrevno"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/svn-revno (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/svn-revno        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/svn-revno        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancetest_benchmarkpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/test_benchmark.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/test_benchmark.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/test_benchmark.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancetest_event_change_datepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/test_event_change_date.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/test_event_change_date.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/test_event_change_date.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancetest_httpauthpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/test_httpauth.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/test_httpauth.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/test_httpauth.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformancetest_statspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/test_stats.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/test_stats.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/test_stats.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceupload"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/upload (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/upload        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/upload        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribperformanceuploadpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/upload.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/upload.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/performance/upload.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribtoolsanonymous_logpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/anonymous_log.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/anonymous_log.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/anonymous_log.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribtoolsdtraceanalyzepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/dtraceanalyze.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/dtraceanalyze.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/dtraceanalyze.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx"> # coding=utf-8
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribtoolsfakecalendardatapy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/fakecalendardata.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/fakecalendardata.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/fakecalendardata.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribtoolsfix_calendar"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/fix_calendar (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/fix_calendar        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/fix_calendar        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribtoolsharpoonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/harpoon.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/harpoon.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/harpoon.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/ngs/app/ical/code/bin/python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribtoolsmonitoranalysispy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/monitoranalysis.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/monitoranalysis.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/monitoranalysis.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribtoolsmonitorsplitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/monitorsplit.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/monitorsplit.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/monitorsplit.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribtoolsnetstatuspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/netstatus.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/netstatus.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/netstatus.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribtoolspg_stats_analysispy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/pg_stats_analysis.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/pg_stats_analysis.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/pg_stats_analysis.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribtoolspgtraced"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/pgtrace.d (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/pgtrace.d        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/pgtrace.d        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -7,7 +7,7 @@
</span><span class="cx">  *   Count postgres operations over time 
</span><span class="cx">  * 
</span><span class="cx"> ## 
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved. 
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved. 
</ins><span class="cx"> # 
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;); 
</span><span class="cx"> # you may not use this file except in compliance with the License. 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribtoolsprotocolanalysispy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/protocolanalysis.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/protocolanalysis.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/protocolanalysis.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribtoolsreadStatspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/readStats.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/readStats.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/readStats.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribtoolsrequest_monitorpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/request_monitor.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/request_monitor.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/request_monitor.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribtoolssortrecurrencespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/sortrecurrences.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/sortrecurrences.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/sortrecurrences.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribtoolssqldata_from_pathpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/sqldata_from_path.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/sqldata_from_path.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/sqldata_from_path.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribtoolstablespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/tables.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/tables.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/tables.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribtoolstest_protocolanalysispy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/test_protocolanalysis.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/test_protocolanalysis.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/tools/test_protocolanalysis.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribwebpollMakefile"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/Makefile (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/Makefile        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/Makefile        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribwebpollwebappjscaldavjs"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/webapp/js/caldav.js (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/webapp/js/caldav.js        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/webapp/js/caldav.js        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> /**
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribwebpollwebappjsjcaljs"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/webapp/js/jcal.js (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/webapp/js/jcal.js        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/webapp/js/jcal.js        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> /**
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribwebpollwebappjsutilsjs"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/webapp/js/utils.js (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/webapp/js/utils.js        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/webapp/js/utils.js        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> /**
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionscontribwebpollwebappjswebpolljs"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/webapp/js/webpoll.js (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/webapp/js/webpoll.js        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/contrib/webpoll/webapp/js/webpoll.js        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> /**
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsdocExtensionscaldavrecursplittxtfromrev12321CalendarServertrunkdocExtensionscaldavrecursplittxt"></a>
<div class="copfile"><h4>Copied: CalendarServer/branches/users/gaya/cleanrevisions/doc/Extensions/caldav-recursplit.txt (from rev 12321, CalendarServer/trunk/doc/Extensions/caldav-recursplit.txt) (0 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/doc/Extensions/caldav-recursplit.txt                                (rev 0)
+++ CalendarServer/branches/users/gaya/cleanrevisions/doc/Extensions/caldav-recursplit.txt        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -0,0 +1,504 @@
</span><ins>+
+
+
+Calendar Server Extension                                       C. Daboo
+                                                                   Apple
+                                                        January 10, 2014
+
+
+             Smart Splitting of Recurring Events in CalDAV
+
+Abstract
+
+   This document defines an extension to CalDAV that allows calendar
+   clients to split recurring events on the server in such a way as to
+   preserve the original per-attendee data, such as alarms and
+   participation status.
+
+
+Table of Contents
+
+   1.  Introduction  . . . . . . . . . . . . . . . . . . . . . . . . . 2
+   2.  Conventions Used in This Document . . . . . . . . . . . . . . . 3
+   3.  New behavior  . . . . . . . . . . . . . . . . . . . . . . . . . 3
+     3.1.  Example . . . . . . . . . . . . . . . . . . . . . . . . . . 6
+   4.  Security Considerations . . . . . . . . . . . . . . . . . . . . 8
+   5.  IANA Considerations . . . . . . . . . . . . . . . . . . . . . . 8
+   6.  Normative References  . . . . . . . . . . . . . . . . . . . . . 8
+   Appendix A.  Acknowledgments  . . . . . . . . . . . . . . . . . . . 9
+   Author's Address  . . . . . . . . . . . . . . . . . . . . . . . . . 9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo                                                           [Page 1]
+
+                       CalDAV Recurrence Splitting          January 2014
+
+
+1.  Introduction
+
+   Internet calendaring and scheduling standards are defined by
+   iCalendar [RFC5545] and iTIP [RFC5546].  The CalDAV Access [RFC4791]
+   standard defines a way to access calendar data stored on a server,
+   and the CalDAV Scheduling [RFC6638] draft defines how scheduling
+   occurs between users of a CalDAV server.
+
+   When dealing with recurring events defined in iCalendar, it is often
+   necessary for the organizer of the events to apply a change from one
+   of the recurrence instances on into the future (e.g., add a new
+   attendee part way through the series of meetings). iCalendar supports
+   a &quot;RANGE&quot; property parameter on the &quot;RECURRENCE-ID&quot; property that
+   allows for a &quot;THIS-AND-FUTURE&quot; change to an existing set of recurring
+   events.  However, the &quot;RANGE&quot; behavior is not always implemented.
+   Instead, clients split the recurring series into two separate events
+   (different UIDs and thus different calendar object resources stored
+   in a CalDAV calendar).  One series contains all the instances up to
+   the point where the change is made, and the other contains all the
+   instances from that point onwards.  Typically this is done by
+   truncating the recurrence rule in the existing resource and creating
+   a new resource for the ongoing recurrence.  However, when done that
+   way, it results in any per-attendee data in the original resource for
+   recurrence instances after the &quot;split point&quot; being lost - i.e.,
+   attendee loose all their status for the ongoing instances.  What is
+   more, due to the requirements of CalDAV scheduling, the &quot;PARTSTAT&quot;
+   parameter on the &quot;ATTENDEE&quot; properties in the new calendar object
+   resource will be forcibly reset to &quot;NEEDS-ACTION&quot;, requiring
+   attendees to re-accept/decline the ongoing recurrence series in the
+   new calendar object resource.  This is obviously a poor user
+   experience that needs to be corrected.
+
+   This specification defines a new CalDAV POST request action that
+   causes the server to split an existing calendar object resource
+   containing a recurring event, into two pieces at a specified &quot;split
+   point&quot;, such that per-attendee data and attendee participation status
+   is preserved in the new calendar object resource created by the
+   split.  Once that is done, clients can then modify the new resource
+   to make the actual &quot;this-and-future&quot; change that triggers the split.
+
+   This specification does not cover the case of splitting of scheduled
+   calendar data for attendees not hosted on the CalDAV server.
+   Instead, existing existing procedures for sending iTIP messages have
+   to be used to update the attendee data to account for the split,
+   likely resulting in loss of per-attendee data.  A future extension to
+   iTIP might be possible to address that, but is not covered here.
+
+
+
+
+
+Daboo                                                           [Page 2]
+
+                       CalDAV Recurrence Splitting          January 2014
+
+
+2.  Conventions Used in This Document
+
+   The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;,
+   &quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;MAY&quot;, and &quot;OPTIONAL&quot; in this
+   document are to be interpreted as described in [RFC2119].
+
+   When XML element types in the namespaces &quot;DAV:&quot; and
+   &quot;urn:ietf:params:xml:ns:caldav&quot; are referenced in this document
+   outside of the context of an XML fragment, the string &quot;DAV:&quot; and
+   &quot;CALDAV:&quot; will be prefixed to the element type names respectively.
+
+   The namespace &quot;http://calendarserver.org/ns/&quot; is used for XML
+   elements defined in this specification.  When XML element types in
+   this namespace are referenced in this document outside of the context
+   of an XML fragment, the string &quot;CS:&quot; will be prefixed to the element
+   type names respectively.
+
+   The prefix X-CALENDARSERVER- is used for all iCalendar properties,
+   parameters and enumerated values defined in this extension.
+
+
+3.  New behavior
+
+   A server supporting the features described in this specification MUST
+   include &quot;calendarserver-recurrence-split&quot; as a field in the DAV
+   response header from an OPTIONS request on a calendar home
+   collection.
+
+   To split an existing calendar object resource containing a recurring
+   event, a client issues an HTTP POST resource with the request-uri set
+   to the URI of the calendar object resource.  The client also includes
+   the following two URI query parameters:
+
+   1.  &quot;action&quot; set to the value &quot;split&quot;
+
+   2.  &quot;rid&quot; set to an iCalendar format DATE-TIME value in UTC
+       (&quot;YYYYMMDDTHHMMSSZ&quot; style format).
+
+   The &quot;action&quot; parameter is used to distinguish this operation from
+   others that might be defined in the future for calendar object
+   resources.  The &quot;rid&quot; parameter specified the UTC date-time where the
+   split is to occur.  The actual split occurs at the next recurrence
+   instance on or after the &quot;rid&quot; parameter value - the &quot;split point&quot;.
+
+   Client MUST include both parameters in the POST request and MUST
+   ensure a valid date-time value is used.  The date-time value MUST NOT
+   be earlier than the start time of the first instance of the
+   recurrence set, and it MUST NOT be later than the start time of the
+
+
+
+Daboo                                                           [Page 3]
+
+                       CalDAV Recurrence Splitting          January 2014
+
+
+   last instance of the recurrence set.  If the &quot;rid&quot; parameter value is
+   not of the correct format or missing, the server MUST return a DAV:
+   error response with the CALDAV:valid-rid-parameter pre-condition
+   code.  If the &quot;rid&quot; parameter is valid, but outside of the allowed
+   range, or the targeted calendar object resource is not recurring,
+   then the server MUST return a DAV:error response with the CS:invalid-
+   split pre-condition code.  The server MUST reject any attempt by an
+   attendee to split their copy of a scheduled calendar object resource
+   - only organizers are allowed to split events.
+
+   Clients MAY include an HTTP &quot;Prefer&quot; request header including the
+   value &quot;return=representation&quot; (see [I-D.snell-http-prefer]).  That
+   instructs the server to return a WebDAV multistatus response
+   containing two responses: one for the targeted resource and one for
+   the new resource created as a result of the split.  The multistatus
+   response MUST include the DAV:getetag and CALDAV:calendar-data
+   properties for each resource.  In the absence of the &quot;Prefer:
+   return=representation&quot; request header, the server MUST return an HTTP
+   &quot;Split-Component-URL&quot; response header whose value is the URI of the
+   new resource created as a result of the split.
+
+   When a server receives a valid split request as described above, it
+   does the equivalent of the following:
+
+   1.  The existing resource is duplicated, preserving any per-user data
+       such as alarms or transparency status.
+
+   2.  The calendar data in the existing resource is modified as
+       follows:
+
+       A.  Any overridden components with a &quot;RECURRENCE-ID&quot; property
+           value prior to the split point are removed.
+
+       B.  Any &quot;RDATE&quot; or &quot;EXDATE&quot; property values prior to the split
+           point are removed.
+
+       C.  Any &quot;RRULE&quot; property that only generates instances prior to
+           the split point is removed.
+
+       D.  Any remaining &quot;RRULE&quot; property has its &quot;COUNT&quot; value adjusted
+           by subtracting the number of instances prior to the split
+           point.
+
+       E.  The &quot;DTSTART&quot; property of the master instance is adjusted to
+           the value of the first instance of the &quot;RRULE&quot; on or after
+           the split point, or, in the absence of an &quot;RRULE&quot;, to the
+           first &quot;RDATE&quot; property value on or after the split point.
+
+
+
+
+Daboo                                                           [Page 4]
+
+                       CalDAV Recurrence Splitting          January 2014
+
+
+   3.  The calendar data in the new resource is modified as follows:
+
+       A.  Any overridden components with a &quot;RECURRENCE-ID&quot; property
+           value on or after the split point are removed.
+
+       B.  Any &quot;RDATE&quot; or &quot;EXDATE&quot; property values on or after the split
+           point are removed.
+
+       C.  Any &quot;RRULE&quot; property that only generates instances on or
+           after the split point is removed.
+
+       D.  Any remaining &quot;RRULE&quot; property has an &quot;UNTIL&quot; value applied,
+           with the until value being one second less than the split
+           point.
+
+       E.  The &quot;UID&quot; property of all components is changed to (the same)
+           new value.
+
+       F.  Attendee participation status MUST NOT be changed.
+
+   4.  The server MUST add a &quot;RELATED&quot; property, with a &quot;RELTYPE&quot;
+       parameter set to &quot;X-CALENDARSERVER-RECURRENCE-SET&quot;, and with its
+       value set to the &quot;UID&quot; property value of the new resource to all
+       components of the existing and new resources, if the existing
+       resource does not contain a &quot;RELATED&quot; property with a &quot;RELTYPE&quot;
+       parameter value set to &quot;X-CALENDARSERVER-RECURRENCE-SET&quot;.
+
+   When an organizer splits a scheduled event, the server performs the
+   following actions:
+
+   1.  For each attendee hosted on the same server, the server MUST
+       split the attendee's copy of the event in accordance with the
+       split point used by the organizer.  In doing so, it MUST preserve
+       any per-attendee state (alarms, transparency, participation
+       status) in the new resource (which also MUST have the same &quot;UID&quot;
+       property value as the organizer's new resource).
+
+   2.  For each attendee not hosted on the same server, the server will
+       need to send a series of iTIP messages to correctly update the
+       attendee with both the modified (old) resource data and the new
+       resource.  This will likely result in loss of per-attendee data
+       such as alarms (though the participation status might be
+       preserved if the calendar user agent processing the new iTIP
+       message for the new resource allows it).
+
+   Note that, since attendees can be invited to specific instances of a
+   recurring meeting (not necessarily the entire set), it is possible
+   that either the old or new calendar data no longer contains any valid
+
+
+
+Daboo                                                           [Page 5]
+
+                       CalDAV Recurrence Splitting          January 2014
+
+
+   components since the attendee was not invited to the corresponding
+   portions of the original split recurrence.  In such cases, the server
+   MUST remove the original resource, or MUST NOT create the new
+   resource.
+
+3.1.  Example
+
+   Assume the following iCalendar data is stored in the resource with
+   URI &quot;/event.ics&quot;:
+   BEGIN:VCALENDAR
+   PRODID:-//Example Inc.//Example Calendar//EN
+   VERSION:2.0
+   BEGIN:VEVENT
+   DTSTAMP:20140110T135358Z
+   DTSTART:20140101T120000Z
+   DURATION:PT1H
+   SUMMARY:Example
+   UID:DF400028-1223-4D26-92CA-B0ED3CC161F3
+   RRULE:FREQ=DAILY;COUNT=20
+   END:VEVENT
+   END:VCALENDAR
+
+   The client issues a POST split request to split the recurring event
+   at the instance with date-time &quot;20140110T120000Z&quot;:
+
+   &gt;&gt; Request &lt;&lt;
+
+   POST /event.ics?action=split&amp;rid=20140110T120000Z HTTP/1.1
+   Host: cal.example.com
+   Content-Length: 0
+   Prefer: return=representation
+
+
+   &gt;&gt; Response &lt;&lt;
+
+   HTTP/1.1 207 Multi-Status
+   ETag: &quot;5bc9a2b55081eba0a9cd34f742aa1c11&quot;
+   Date: Fri, 10 Jan 2014 14:02:20 GMT
+   Content-Type: text/xml
+   Content-Length: xxxx
+
+   &lt;?xml version='1.0' encoding='UTF-8'?&gt;
+   &lt;multistatus xmlns='DAV:'&gt;
+     &lt;response&gt;
+       &lt;href&gt;/event.ics&lt;/href&gt;
+       &lt;propstat&gt;
+         &lt;prop&gt;
+           &lt;getetag&gt;&quot;5bc9a2b55081eba0a9cd34f742aa1c11&quot;&lt;/getetag&gt;
+
+
+
+Daboo                                                           [Page 6]
+
+                       CalDAV Recurrence Splitting          January 2014
+
+
+           &lt;calendar-data xmlns='urn:ietf:params:xml:ns:caldav'
+   &gt;BEGIN:VCALENDAR
+   VERSION:2.0
+   PRODID:-//Example Inc.//Example Calendar//EN
+   BEGIN:VEVENT
+   UID:DF400028-1223-4D26-92CA-B0ED3CC161F3
+   DTSTART:20140110T120000Z
+   DURATION:PT1H
+   DTSTAMP:20140110T135358Z
+   RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:E3B9D6D4-E19F-
+    47AA-9088-1A29A9A7030F
+   RRULE:FREQ=DAILY;COUNT=11
+   SUMMARY:Example
+   END:VEVENT
+   END:VCALENDAR
+   &lt;/calendar-data&gt;
+         &lt;/prop&gt;
+         &lt;status&gt;HTTP/1.1 200 OK&lt;/status&gt;
+       &lt;/propstat&gt;
+     &lt;/response&gt;
+     &lt;response&gt;
+       &lt;href&gt;/event-split.ics&lt;/href&gt;
+       &lt;propstat&gt;
+         &lt;prop&gt;
+           &lt;getetag&gt;&quot;8b352ad2e0ca26c99cb205373b3dc34c&quot;&lt;/getetag&gt;
+           &lt;calendar-data xmlns='urn:ietf:params:xml:ns:caldav'
+   &gt;BEGIN:VCALENDAR
+   VERSION:2.0
+   PRODID:-//Example Inc.//Example Calendar//EN
+   BEGIN:VEVENT
+   UID:E3B9D6D4-E19F-47AA-9088-1A29A9A7030F
+   DTSTART:20140110T120000Z
+   DURATION:PT1H
+   DTSTAMP:20140110T135358Z
+   RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:E3B9D6D4-E19F-
+    47AA-9088-1A29A9A7030F
+   RRULE:FREQ=DAILY;UNTIL=20140110T115959Z
+   SUMMARY:Example
+   END:VEVENT
+   END:VCALENDAR
+   &lt;/calendar-data&gt;
+         &lt;/prop&gt;
+         &lt;status&gt;HTTP/1.1 200 OK&lt;/status&gt;
+       &lt;/propstat&gt;
+     &lt;/response&gt;
+   &lt;/multistatus&gt;
+
+   The original resource is changed to have a start date-time value of
+
+
+
+Daboo                                                           [Page 7]
+
+                       CalDAV Recurrence Splitting          January 2014
+
+
+   &quot;20140110T120000Z&quot;, and the &quot;COUNT&quot; component of the &quot;RRULE&quot; property
+   is adjusted to the value &quot;11&quot; (which represents the number of
+   remaining instances for that event, 9 early instances having been
+   removed).  The new resource has the original start date-time value,
+   and its &quot;RRULE&quot; property has an &quot;UNTIL&quot; value one second prior to the
+   split point.  Both resources have a &quot;RELATED&quot; property with a
+   &quot;RELTYPE&quot; parameter set to &quot;X-CALENDARSERVER-RECURRENCE-SET&quot; and a
+   value set to the &quot;UID&quot; property value of the new resource.
+
+
+4.  Security Considerations
+
+   This specification does not introduce any more security
+   considerations beyond those already listed in iCalendar [RFC5545],
+   iTIP [RFC5546] and CalDAV Access [RFC4791] and CalDAV Scheduling
+   [RFC6638].
+
+
+5.  IANA Considerations
+
+   TBD: new HTTP request header registration.
+
+
+6.  Normative References
+
+   [I-D.snell-http-prefer]
+              Snell, J., &quot;Prefer Header for HTTP&quot;,
+              draft-snell-http-prefer-18 (work in progress),
+              January 2013.
+
+   [RFC2119]  Bradner, S., &quot;Key words for use in RFCs to Indicate
+              Requirement Levels&quot;, BCP 14, RFC 2119, March 1997.
+
+   [RFC4791]  Daboo, C., Desruisseaux, B., and L. Dusseault,
+              &quot;Calendaring Extensions to WebDAV (CalDAV)&quot;, RFC 4791,
+              March 2007.
+
+   [RFC5545]  Desruisseaux, B., &quot;Internet Calendaring and Scheduling
+              Core Object Specification (iCalendar)&quot;, RFC 5545,
+              September 2009.
+
+   [RFC5546]  Daboo, C., &quot;iCalendar Transport-Independent
+              Interoperability Protocol (iTIP)&quot;, RFC 5546,
+              December 2009.
+
+   [RFC6638]  Daboo, C. and B. Desruisseaux, &quot;Scheduling Extensions to
+              CalDAV&quot;, RFC 6638, June 2012.
+
+
+
+
+Daboo                                                           [Page 8]
+
+                       CalDAV Recurrence Splitting          January 2014
+
+
+Appendix A.  Acknowledgments
+
+   This specification is the result of discussions between the Apple
+   calendar server and client teams.
+
+
+Author's Address
+
+   Cyrus Daboo
+   Apple Inc.
+   1 Infinite Loop
+   Cupertino, CA  95014
+   USA
+
+   Email: cyrus@daboo.name
+   URI:   http://www.apple.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo                                                           [Page 9]
+
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsdocExtensionscaldavrecursplitxmlfromrev12321CalendarServertrunkdocExtensionscaldavrecursplitxml"></a>
<div class="copfile"><h4>Copied: CalendarServer/branches/users/gaya/cleanrevisions/doc/Extensions/caldav-recursplit.xml (from rev 12321, CalendarServer/trunk/doc/Extensions/caldav-recursplit.xml) (0 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/doc/Extensions/caldav-recursplit.xml                                (rev 0)
+++ CalendarServer/branches/users/gaya/cleanrevisions/doc/Extensions/caldav-recursplit.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -0,0 +1,267 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
+&lt;?xml-stylesheet type=&quot;text/xsl&quot; href=&quot;../rfc2629.xslt&quot;?&gt;
+&lt;!DOCTYPE rfc SYSTEM 'rfc2629.dtd' [
+&lt;!ENTITY rfc2119 PUBLIC '' 'bibxml/reference.RFC.2119.xml'&gt;
+&lt;!ENTITY rfc5545 PUBLIC '' 'bibxml/reference.RFC.5545.xml'&gt;
+&lt;!ENTITY rfc5546 PUBLIC '' 'bibxml/reference.RFC.5546.xml'&gt;
+&lt;!ENTITY rfc4791 PUBLIC '' 'bibxml/reference.RFC.4791.xml'&gt;
+&lt;!ENTITY rfc6638 PUBLIC '' 'bibxml/reference.RFC.6638.xml'&gt;
+&lt;!ENTITY idPreferHeader SYSTEM 'http://xml.resource.org/public/rfc/bibxml3/reference.I-D.snell-http-prefer.xml'&gt;
+]&gt; 
+&lt;?rfc toc=&quot;yes&quot;?&gt;
+&lt;?rfc tocdepth=&quot;4&quot;?&gt;
+&lt;?rfc strict=&quot;yes&quot;?&gt;
+&lt;?rfc comments=&quot;yes&quot;?&gt;
+&lt;?rfc inline=&quot;yes&quot;?&gt;
+&lt;?rfc symrefs=&quot;yes&quot;?&gt;
+&lt;?rfc sortrefs=&quot;yes&quot;?&gt;
+&lt;?rfc compact=&quot;yes&quot;?&gt;
+&lt;?rfc subcompact=&quot;no&quot;?&gt;
+&lt;?rfc private=&quot;Calendar Server Extension&quot;?&gt;
+&lt;rfc ipr=&quot;none&quot; docName='caldav-recursplit-00'&gt;
+    &lt;front&gt;
+        &lt;title abbrev=&quot;CalDAV Recurrence Splitting&quot;&gt;Smart Splitting of Recurring Events in CalDAV&lt;/title&gt; 
+        &lt;author initials=&quot;C.&quot; surname=&quot;Daboo&quot; fullname=&quot;Cyrus Daboo&quot;&gt;
+            &lt;organization abbrev=&quot;Apple&quot;&gt;
+                Apple Inc.
+            &lt;/organization&gt;
+            &lt;address&gt;
+                &lt;postal&gt;
+                    &lt;street&gt;1 Infinite Loop&lt;/street&gt;
+                    &lt;city&gt;Cupertino&lt;/city&gt;
+                    &lt;region&gt;CA&lt;/region&gt;
+                    &lt;code&gt;95014&lt;/code&gt; 
+                    &lt;country&gt;USA&lt;/country&gt;
+                &lt;/postal&gt;
+                &lt;email&gt;cyrus@daboo.name&lt;/email&gt;
+                &lt;uri&gt;http://www.apple.com/&lt;/uri&gt;
+            &lt;/address&gt;
+        &lt;/author&gt;
+        &lt;date /&gt;
+        &lt;abstract&gt;
+            &lt;t&gt;
+                This document defines an extension to CalDAV that allows calendar clients to split recurring events on the server in such a way as to preserve the original per-attendee data, such as alarms and participation status.
+            &lt;/t&gt;
+        &lt;/abstract&gt;
+    &lt;/front&gt;
+    &lt;middle&gt;
+        &lt;section title='Introduction'&gt;
+            &lt;t&gt;
+                Internet calendaring and scheduling standards are defined by &lt;xref target=&quot;RFC5545&quot;&gt;iCalendar&lt;/xref&gt; and &lt;xref target=&quot;RFC5546&quot;&gt;iTIP&lt;/xref&gt;. The &lt;xref target=&quot;RFC4791&quot;&gt;CalDAV Access&lt;/xref&gt; standard defines a way to access calendar data stored on a server, and the &lt;xref target=&quot;RFC6638&quot;&gt;CalDAV Scheduling&lt;/xref&gt; draft defines how scheduling occurs between users of a CalDAV server.
+            &lt;/t&gt;
+            &lt;t&gt;
+                When dealing with recurring events defined in iCalendar, it is often necessary for the organizer of the events to apply a change from one of the recurrence instances on into the future (e.g., add a new attendee part way through the series of meetings). iCalendar supports a &quot;RANGE&quot; property parameter on the &quot;RECURRENCE-ID&quot; property that allows for a &quot;THIS-AND-FUTURE&quot; change to an existing set of recurring events. However, the &quot;RANGE&quot; behavior is not always implemented. Instead, clients split the recurring series into two separate events (different UIDs and thus different calendar object resources stored in a CalDAV calendar). One series contains all the instances up to the point where the change is made, and the other contains all the instances from that point onwards. Typically this is done by truncating the recurrence rule in the existing resource and creating a new resource for the ongoing recurrence. However, when done that way, it results in any per-attendee data in the original resource for recurrence instances after the &quot;split point&quot; being lost - i.e., attendee loose all their status for the ongoing instances. What is more, due to the requirements of CalDAV scheduling, the &quot;PARTSTAT&quot; parameter on the &quot;ATTENDEE&quot; properties in the new calendar object resource will be forcibly reset to &quot;NEEDS-ACTION&quot;, requiring attendees to re-accept/decline the ongoing recurrence series in the new calendar object resource. This is obviously a poor user experience that needs to be corrected.
+            &lt;/t&gt;
+            &lt;t&gt;
+                This specification defines a new CalDAV POST request action that causes the server to split an existing calendar object resource containing a recurring event, into two pieces at a specified &quot;split point&quot;, such that per-attendee data and attendee participation status is preserved in the new calendar object resource created by the split. Once that is done, clients can then modify the new resource to make the actual &quot;this-and-future&quot; change that triggers the split.
+            &lt;/t&gt;
+            &lt;t&gt;
+              This specification does not cover the case of splitting of scheduled calendar data for attendees not hosted on the CalDAV server. Instead, existing existing procedures for sending iTIP messages have to be used to update the attendee data to account for the split, likely resulting in loss of per-attendee data. A future extension to iTIP might be possible to address that, but is not covered here.
+            &lt;/t&gt;
+        &lt;/section&gt;
+        &lt;section title='Conventions Used in This Document'&gt;
+            &lt;t&gt;
+                The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;, &quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;MAY&quot;, and &quot;OPTIONAL&quot; in this document are to be interpreted as described in &lt;xref target='RFC2119' /&gt;. 
+            &lt;/t&gt;
+            &lt;t&gt;
+                When XML element types in the namespaces &quot;DAV:&quot; and &quot;urn:ietf:params:xml:ns:caldav&quot; are referenced in this document outside of the context of an XML fragment, the string &quot;DAV:&quot; and &quot;CALDAV:&quot; will be prefixed to the element type names respectively. 
+            &lt;/t&gt;
+            &lt;t&gt;
+                The namespace &quot;http://calendarserver.org/ns/&quot; is used for XML elements defined in this specification.  When XML element types in this namespace are referenced in this document outside of the context of an XML fragment, the string &quot;CS:&quot; will be prefixed to the element type names respectively. 
+            &lt;/t&gt;
+            &lt;t&gt;
+                The prefix X-CALENDARSERVER- is used for all iCalendar properties, parameters and enumerated values defined in this extension. 
+            &lt;/t&gt;
+        &lt;/section&gt;
+        
+        &lt;section title=&quot;New behavior&quot;&gt;
+          &lt;t&gt;A server supporting the features described in this specification MUST include &quot;calendarserver-recurrence-split&quot; as a field in the DAV response header from an OPTIONS request on a calendar home collection.&lt;/t&gt;
+          &lt;t&gt;To split an existing calendar object resource containing a recurring event, a client issues an HTTP POST resource with the request-uri set to the URI of the calendar object resource. The client also includes the following two URI query parameters:
+            &lt;list style='numbers'&gt;
+              &lt;t&gt;&quot;action&quot; set to the value &quot;split&quot;&lt;/t&gt;
+              &lt;t&gt;&quot;rid&quot; set to an iCalendar format DATE-TIME value in UTC (&quot;YYYYMMDDTHHMMSSZ&quot; style format).&lt;/t&gt;
+            &lt;/list&gt;
+            The &quot;action&quot; parameter is used to distinguish this operation from others that might be defined in the future for calendar object resources. The &quot;rid&quot; parameter specified the UTC date-time where the split is to occur. The actual split occurs at the next recurrence instance on or after the &quot;rid&quot; parameter value - the &quot;split point&quot;.&lt;/t&gt;
+            &lt;t&gt;
+            Client MUST include both parameters in the POST request and MUST ensure a valid date-time value is used. The date-time value MUST NOT be earlier than the start time of the first instance of the recurrence set, and it MUST NOT be later than the start time of the last instance of the recurrence set. If the &quot;rid&quot; parameter value is not of the correct format or missing, the server MUST return a DAV:error response with the CALDAV:valid-rid-parameter pre-condition code. If the &quot;rid&quot; parameter is valid, but outside of the allowed range, or the targeted calendar object resource is not recurring, then the server MUST return a DAV:error response with the CS:invalid-split pre-condition code. The server MUST reject any attempt by an attendee to split their copy of a scheduled calendar object resource - only organizers are allowed to split events.
+          &lt;/t&gt;
+          &lt;t&gt;
+            Clients MAY include an HTTP &quot;Prefer&quot; request header including the value &quot;return=representation&quot; (see &lt;xref target='I-D.snell-http-prefer'/&gt;). That instructs the server to return a WebDAV multistatus response containing two responses: one for the targeted resource and one for the new resource created as a result of the split. The multistatus response MUST include the DAV:getetag and CALDAV:calendar-data properties for each resource. In the absence of the &quot;Prefer:return=representation&quot; request header, the server MUST return an HTTP &quot;Split-Component-URL&quot; response header whose value is the URI of the new resource created as a result of the split.
+          &lt;/t&gt;
+          &lt;t&gt;
+            When a server receives a valid split request as described above, it does the equivalent of the following:
+            &lt;list style='numbers'&gt;
+              &lt;t&gt;The existing resource is duplicated, preserving any per-user data such as alarms or transparency status.&lt;/t&gt;
+              &lt;t&gt;The calendar data in the existing resource is modified as follows:
+                &lt;list style='letters'&gt;
+                  &lt;t&gt;Any overridden components with a &quot;RECURRENCE-ID&quot; property value prior to the split point are removed.&lt;/t&gt;
+                  &lt;t&gt;Any &quot;RDATE&quot; or &quot;EXDATE&quot; property values prior to the split point are removed.&lt;/t&gt;
+                  &lt;t&gt;Any &quot;RRULE&quot; property that only generates instances prior to the split point is removed.&lt;/t&gt;
+                  &lt;t&gt;Any remaining &quot;RRULE&quot; property has its &quot;COUNT&quot; value adjusted by subtracting the number of instances prior to the split point.&lt;/t&gt;
+                  &lt;t&gt;The &quot;DTSTART&quot; property of the master instance is adjusted to the value of the first instance of the &quot;RRULE&quot; on or after the split point, or, in the absence of an &quot;RRULE&quot;, to the first &quot;RDATE&quot; property value on or after the split point.&lt;/t&gt;
+                &lt;/list&gt;
+              &lt;/t&gt;
+              &lt;t&gt;The calendar data in the new resource is modified as follows:
+                &lt;list style='letters'&gt;
+                  &lt;t&gt;Any overridden components with a &quot;RECURRENCE-ID&quot; property value on or after the split point are removed.&lt;/t&gt;
+                  &lt;t&gt;Any &quot;RDATE&quot; or &quot;EXDATE&quot; property values on or after the split point are removed.&lt;/t&gt;
+                  &lt;t&gt;Any &quot;RRULE&quot; property that only generates instances on or after the split point is removed.&lt;/t&gt;
+                  &lt;t&gt;Any remaining &quot;RRULE&quot; property has an &quot;UNTIL&quot; value applied, with the until value being one second less than the split point.&lt;/t&gt;
+                  &lt;t&gt;The &quot;UID&quot; property of all components is changed to (the same) new value.&lt;/t&gt;
+                  &lt;t&gt;Attendee participation status MUST NOT be changed.&lt;/t&gt;
+                &lt;/list&gt;
+              &lt;/t&gt;
+              &lt;t&gt;
+                The server MUST add a &quot;RELATED&quot; property, with a &quot;RELTYPE&quot; parameter set to &quot;X-CALENDARSERVER-RECURRENCE-SET&quot;, and with its value set to the &quot;UID&quot; property value of the new resource to all components of the existing and new resources, if the existing resource does not contain a &quot;RELATED&quot; property with a &quot;RELTYPE&quot; parameter value set to &quot;X-CALENDARSERVER-RECURRENCE-SET&quot;. 
+              &lt;/t&gt;
+            &lt;/list&gt;
+          &lt;/t&gt;
+          &lt;t&gt;
+              When an organizer splits a scheduled event, the server performs the following actions:
+            &lt;list style=&quot;numbers&quot;&gt;
+              &lt;t&gt;For each attendee hosted on the same server, the server MUST split the attendee's copy of the event in accordance with the split point used by the organizer. In doing so, it MUST preserve any per-attendee state (alarms, transparency, participation status) in the new resource (which also MUST have the same &quot;UID&quot; property value as the organizer's new resource).&lt;/t&gt;
+              &lt;t&gt;For each attendee not hosted on the same server, the server will need to send a series of iTIP messages to correctly update the attendee with both the modified (old) resource data and the new resource. This will likely result in loss of per-attendee data such as alarms (though the participation status might be preserved if the calendar user agent processing the new iTIP message for the new resource allows it).&lt;/t&gt;
+            &lt;/list&gt;
+          &lt;/t&gt;
+          &lt;t&gt;
+            Note that, since attendees can be invited to specific instances of a recurring meeting (not necessarily the entire set), it is possible that either the old or new calendar data no longer contains any valid components since the attendee was not invited to the corresponding portions of the original split recurrence. In such cases, the server MUST remove the original resource, or MUST NOT create the new resource.
+          &lt;/t&gt;
+          &lt;section title='Example'&gt;
+            &lt;t&gt;Assume the following iCalendar data is stored in the resource with URI &quot;/event.ics&quot;:
+            &lt;figure&gt;&lt;artwork&gt;&lt;![CDATA[BEGIN:VCALENDAR
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20140110T135358Z
+DTSTART:20140101T120000Z
+DURATION:PT1H
+SUMMARY:Example
+UID:DF400028-1223-4D26-92CA-B0ED3CC161F3
+RRULE:FREQ=DAILY;COUNT=20
+END:VEVENT
+END:VCALENDAR
+]]&gt;&lt;/artwork&gt;&lt;/figure&gt;
+            &lt;/t&gt;
+            &lt;t&gt;
+              The client issues a POST split request to split the recurring event at the instance with date-time &quot;20140110T120000Z&quot;:
+        &lt;figure&gt;
+          &lt;preamble&gt;
+            &amp;gt;&amp;gt; Request &amp;lt;&amp;lt;
+          &lt;/preamble&gt;
+          &lt;artwork&gt;
+&lt;![CDATA[POST /event.ics?action=split&amp;rid=20140110T120000Z HTTP/1.1
+Host: cal.example.com
+Content-Length: 0
+Prefer: return=representation
+
+]]&gt;&lt;/artwork&gt; &lt;/figure&gt;
+        &lt;figure&gt;
+          &lt;preamble&gt;
+            &amp;gt;&amp;gt; Response &amp;lt;&amp;lt;
+          &lt;/preamble&gt;
+          &lt;artwork&gt;
+&lt;![CDATA[HTTP/1.1 207 Multi-Status
+ETag: &quot;5bc9a2b55081eba0a9cd34f742aa1c11&quot;
+Date: Fri, 10 Jan 2014 14:02:20 GMT
+Content-Type: text/xml
+Content-Length: xxxx
+
+&lt;?xml version='1.0' encoding='UTF-8'?&gt;
+&lt;multistatus xmlns='DAV:'&gt;
+  &lt;response&gt;
+    &lt;href&gt;/event.ics&lt;/href&gt;
+    &lt;propstat&gt;
+      &lt;prop&gt;
+        &lt;getetag&gt;&quot;5bc9a2b55081eba0a9cd34f742aa1c11&quot;&lt;/getetag&gt;
+        &lt;calendar-data xmlns='urn:ietf:params:xml:ns:caldav'
+&gt;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Example Inc.//Example Calendar//EN
+BEGIN:VEVENT
+UID:DF400028-1223-4D26-92CA-B0ED3CC161F3
+DTSTART:20140110T120000Z
+DURATION:PT1H
+DTSTAMP:20140110T135358Z
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:E3B9D6D4-E19F-
+ 47AA-9088-1A29A9A7030F
+RRULE:FREQ=DAILY;COUNT=11
+SUMMARY:Example
+END:VEVENT
+END:VCALENDAR
+&lt;/calendar-data&gt;
+      &lt;/prop&gt;
+      &lt;status&gt;HTTP/1.1 200 OK&lt;/status&gt;
+    &lt;/propstat&gt;
+  &lt;/response&gt;
+  &lt;response&gt;
+    &lt;href&gt;/event-split.ics&lt;/href&gt;
+    &lt;propstat&gt;
+      &lt;prop&gt;
+        &lt;getetag&gt;&quot;8b352ad2e0ca26c99cb205373b3dc34c&quot;&lt;/getetag&gt;
+        &lt;calendar-data xmlns='urn:ietf:params:xml:ns:caldav'
+&gt;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Example Inc.//Example Calendar//EN
+BEGIN:VEVENT
+UID:E3B9D6D4-E19F-47AA-9088-1A29A9A7030F
+DTSTART:20140110T120000Z
+DURATION:PT1H
+DTSTAMP:20140110T135358Z
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:E3B9D6D4-E19F-
+ 47AA-9088-1A29A9A7030F
+RRULE:FREQ=DAILY;UNTIL=20140110T115959Z
+SUMMARY:Example
+END:VEVENT
+END:VCALENDAR
+&lt;/calendar-data&gt;
+      &lt;/prop&gt;
+      &lt;status&gt;HTTP/1.1 200 OK&lt;/status&gt;
+    &lt;/propstat&gt;
+  &lt;/response&gt;
+&lt;/multistatus&gt;
+]]&gt;&lt;/artwork&gt;&lt;/figure&gt;
+            &lt;/t&gt;
+            &lt;t&gt;
+              The original resource is changed to have a start date-time value of &quot;20140110T120000Z&quot;, and the &quot;COUNT&quot; component of the &quot;RRULE&quot; property is adjusted to the value &quot;11&quot; (which represents the number of remaining instances for that event, 9 early instances having been removed). The new resource has the original start date-time value, and its &quot;RRULE&quot; property has an &quot;UNTIL&quot; value one second prior to the split point. Both resources have a &quot;RELATED&quot; property with a &quot;RELTYPE&quot; parameter set to &quot;X-CALENDARSERVER-RECURRENCE-SET&quot; and a value set to the &quot;UID&quot; property value of the new resource.
+            &lt;/t&gt;
+          &lt;/section&gt;
+        &lt;/section&gt;
+
+        &lt;section title='Security Considerations'&gt;
+            &lt;t&gt;This specification does not introduce any more security considerations beyond those already listed in &lt;xref target=&quot;RFC5545&quot;&gt;iCalendar&lt;/xref&gt;, &lt;xref target=&quot;RFC5546&quot;&gt;iTIP&lt;/xref&gt; and &lt;xref target=&quot;RFC4791&quot;&gt;CalDAV Access&lt;/xref&gt; and &lt;xref target=&quot;RFC6638&quot;&gt;CalDAV Scheduling&lt;/xref&gt;.&lt;/t&gt;
+        &lt;/section&gt;
+        &lt;section title='IANA Considerations'&gt;
+            &lt;t&gt;
+                TBD: new HTTP request header registration.
+            &lt;/t&gt;
+        &lt;/section&gt;
+    &lt;/middle&gt;
+    &lt;back&gt;
+        &lt;references title='Normative References'&gt;
+            &amp;rfc2119;
+            &amp;rfc5545;
+            &amp;rfc5546;
+            &amp;rfc4791;
+            &amp;rfc6638;
+            &amp;idPreferHeader;
+        &lt;/references&gt;
+&lt;!--
+&lt;references title='Informative References'&gt;
+&lt;/references&gt;
+--&gt;
+        &lt;section title='Acknowledgments'&gt;
+            &lt;t&gt;
+                This specification is the result of discussions between the Apple calendar server and client teams.
+            &lt;/t&gt;
+        &lt;/section&gt;
+        &lt;!--
+        &lt;section title='Change History'&gt;
+          &lt;t&gt;Changes since -00
+            &lt;list style='numbers'&gt;
+              &lt;t&gt;&lt;/t&gt;
+            &lt;/list&gt;
+          &lt;/t&gt;
+        &lt;/section&gt;
+        --&gt;
+    &lt;/back&gt;
+&lt;/rfc&gt;
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsdoccaldavd8"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/doc/caldavd.8 (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/doc/caldavd.8        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/doc/caldavd.8        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> .\&quot;
</span><del>-.\&quot; Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+.\&quot; Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> .\&quot;
</span><span class="cx"> .\&quot; Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> .\&quot; you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_bootstrap_database8"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_bootstrap_database.8 (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_bootstrap_database.8        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_bootstrap_database.8        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> .\&quot;
</span><del>-.\&quot; Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+.\&quot; Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> .\&quot;
</span><span class="cx"> .\&quot; Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> .\&quot; you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_command_gateway8"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_command_gateway.8 (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_command_gateway.8        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_command_gateway.8        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> .\&quot;
</span><del>-.\&quot; Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+.\&quot; Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> .\&quot;
</span><span class="cx"> .\&quot; Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> .\&quot; you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_config8"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_config.8 (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_config.8        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_config.8        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> .\&quot;
</span><del>-.\&quot; Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+.\&quot; Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> .\&quot;
</span><span class="cx"> .\&quot; Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> .\&quot; you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_export8"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_export.8 (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_export.8        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_export.8        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> .\&quot;
</span><del>-.\&quot; Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+.\&quot; Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> .\&quot;
</span><span class="cx"> .\&quot; Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> .\&quot; you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_manage_principals8"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_manage_principals.8 (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_manage_principals.8        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_manage_principals.8        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> .\&quot;
</span><del>-.\&quot; Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+.\&quot; Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> .\&quot;
</span><span class="cx"> .\&quot; Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> .\&quot; you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_manage_push8"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_manage_push.8 (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_manage_push.8        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_manage_push.8        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> .\&quot;
</span><del>-.\&quot; Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+.\&quot; Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> .\&quot;
</span><span class="cx"> .\&quot; Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> .\&quot; you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_manage_timezones8"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_manage_timezones.8 (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_manage_timezones.8        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_manage_timezones.8        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> .\&quot;
</span><del>-.\&quot; Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+.\&quot; Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> .\&quot;
</span><span class="cx"> .\&quot; Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> .\&quot; you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_migrate_resources8"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_migrate_resources.8 (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_migrate_resources.8        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_migrate_resources.8        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> .\&quot;
</span><del>-.\&quot; Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+.\&quot; Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> .\&quot;
</span><span class="cx"> .\&quot; Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> .\&quot; you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_monitor_notifications8"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_monitor_notifications.8 (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_monitor_notifications.8        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_monitor_notifications.8        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> .\&quot;
</span><del>-.\&quot; Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+.\&quot; Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> .\&quot;
</span><span class="cx"> .\&quot; Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> .\&quot; you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_purge_attachments8"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_purge_attachments.8 (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_purge_attachments.8        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_purge_attachments.8        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> .\&quot;
</span><del>-.\&quot; Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+.\&quot; Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> .\&quot;
</span><span class="cx"> .\&quot; Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> .\&quot; you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_purge_events8"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_purge_events.8 (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_purge_events.8        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_purge_events.8        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> .\&quot;
</span><del>-.\&quot; Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+.\&quot; Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> .\&quot;
</span><span class="cx"> .\&quot; Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> .\&quot; you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_purge_principals8"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_purge_principals.8 (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_purge_principals.8        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_purge_principals.8        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> .\&quot;
</span><del>-.\&quot; Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+.\&quot; Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> .\&quot;
</span><span class="cx"> .\&quot; Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> .\&quot; you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsdoccalendarserver_shell8"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_shell.8 (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_shell.8        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/doc/calendarserver_shell.8        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> .\&quot;
</span><del>-.\&quot; Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+.\&quot; Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> .\&quot;
</span><span class="cx"> .\&quot; Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> .\&quot; you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionslocalesen_ENISO88591LC_MESSAGEScalendarserverpo"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/locales/en_EN.ISO8859-1/LC_MESSAGES/calendarserver.po (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/locales/en_EN.ISO8859-1/LC_MESSAGES/calendarserver.po        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/locales/en_EN.ISO8859-1/LC_MESSAGES/calendarserver.po        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> # Calendar Server Localization
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> msgid &quot;&quot;
</span><span class="cx"> msgstr &quot;&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionspydoctor"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/pydoctor (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/pydoctor        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/pydoctor        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/bin/sh
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionsrun"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/run (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/run        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/run        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx"> # -*- sh-basic-offset: 2 -*-
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionssetuppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/setup.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/setup.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/setup.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionssim"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/sim (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/sim        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/sim        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/bin/sh
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionssupportApplemake"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/support/Apple.make (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/support/Apple.make        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/support/Apple.make        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -4,7 +4,7 @@
</span><span class="cx"> #
</span><span class="cx"> # This is only useful internally at Apple, probably.
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -55,8 +55,8 @@
</span><span class="cx"> .phony: $(Project) pycalendar build setup prep install install-ossfiles buildit
</span><span class="cx"> 
</span><span class="cx"> CALDAVTESTER = CalDAVTester
</span><del>-PYKERBEROS   = PyKerberos
-PYCALENDAR   = pycalendar
</del><ins>+PYKERBEROS   = PyKerberos-9409
+PYCALENDAR   = PyCalendar-11947
</ins><span class="cx"> PYGRESQL     = PyGreSQL-4.1.1
</span><span class="cx"> SQLPARSE     = sqlparse-0.1.2
</span><span class="cx"> SETPROCTITLE = setproctitle-1.1.6
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionssupportXCodemake"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/support/XCode.make (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/support/XCode.make        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/support/XCode.make        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx"> ##
</span><span class="cx"> # XCode Makefile for CalendarServer
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionssupportbuildsh"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/support/build.sh (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/support/build.sh        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/support/build.sh        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- sh-basic-offset: 2 -*-
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -847,7 +847,7 @@
</span><span class="cx">   local n=&quot;pycrypto&quot;;
</span><span class="cx">   local p=&quot;${n}-${v}&quot;;
</span><span class="cx">   py_dependency -v &quot;${v}&quot; -m &quot;55a61a054aa66812daf5161a0d5d7eda&quot; \
</span><del>-    &quot;PyCrypto&quot; &quot;${n}&quot; &quot;${p}&quot; \
</del><ins>+    &quot;PyCrypto&quot; &quot;Crypto&quot; &quot;${p}&quot; \
</ins><span class="cx">     &quot;http://ftp.dlitz.net/pub/dlitz/crypto/${n}/${p}.tar.gz&quot;;
</span><span class="cx"> 
</span><span class="cx">   local v=&quot;0.1.7&quot;;
</span><span class="lines">@@ -864,7 +864,7 @@
</span><span class="cx">     &quot;${n}&quot; &quot;twisted&quot; &quot;${p}&quot; \
</span><span class="cx">     &quot;${pypi}/T/${n}/${p}.tar.bz2&quot;;
</span><span class="cx"> 
</span><del>-  local v=&quot;12094&quot;;
</del><ins>+  local v=&quot;12213&quot;;
</ins><span class="cx">   local n=&quot;twext&quot;;
</span><span class="cx">   local p=&quot;${n}-${v}&quot;;
</span><span class="cx">   py_dependency -fe -r &quot;${v}&quot; \
</span><span class="lines">@@ -951,7 +951,7 @@
</span><span class="cx">   local n=&quot;Nevow&quot;;
</span><span class="cx">   local p=&quot;${n}-${v}&quot;;
</span><span class="cx">   py_dependency -o -m &quot;66dda2ad88f42dea05911add15f4d1b2&quot; \
</span><del>-    &quot;${n}&quot; &quot;${n}&quot; &quot;${p}&quot; \
</del><ins>+    &quot;${n}&quot; &quot;nevow&quot; &quot;${p}&quot; \
</ins><span class="cx">     &quot;${pypi}/N/${n}/${p}.tar.gz&quot;;
</span><span class="cx"> 
</span><span class="cx">   local v=&quot;0.5b1&quot;;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionssupportgendocs"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/support/gendocs (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/support/gendocs        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/support/gendocs        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/bin/sh
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionssupportpatchapply"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/support/patchapply (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/support/patchapply        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/support/patchapply        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionssupportpatchmaker"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/support/patchmaker (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/support/patchmaker        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/support/patchmaker        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionssupportpysh"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/support/py.sh (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/support/py.sh        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/support/py.sh        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- sh-basic-offset: 2 -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -110,6 +110,9 @@
</span><span class="cx">     done;
</span><span class="cx"> 
</span><span class="cx">     if [ -z &quot;${module_version}&quot; ]; then
</span><ins>+      module_version=$(&quot;${python}&quot; -c 'import pkg_resources; print pkg_resources.get_distribution(&quot;'&quot;${module}&quot;'&quot;).version;');
+    fi;
+    if [ -z &quot;${module_version}&quot; ]; then
</ins><span class="cx">       if ! &quot;${print_path}&quot;; then
</span><span class="cx">         echo &quot;Unable to determine version for ${module}.&quot;;
</span><span class="cx">       fi;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionssupportshellsh"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/support/shell.sh (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/support/shell.sh        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/support/shell.sh        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env bash
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionssupportsubmit"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/support/submit (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/support/submit        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/support/submit        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/bin/sh
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -23,7 +23,7 @@
</span><span class="cx"> set -e
</span><span class="cx"> set -u
</span><span class="cx"> 
</span><del>-version=&quot;20&quot;;
</del><ins>+version=&quot;22&quot;;
</ins><span class="cx"> 
</span><span class="cx">  wd=&quot;$(cd &quot;$(dirname &quot;$0&quot;)&quot; &amp;&amp; pwd)&quot;;
</span><span class="cx"> src=&quot;$(cd &quot;${wd}/..&quot; &amp;&amp; pwd)&quot;;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionssupportversionpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/support/version.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/support/version.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/support/version.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstest"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/test (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/test        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/test        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env bash
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstestserver"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/testserver (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/testserver        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/testserver        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #!/usr/bin/env bash
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedpluginscaldavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twisted/plugins/caldav.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twisted/plugins/caldav.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twisted/plugins/caldav.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -23,7 +23,6 @@
</span><span class="cx"> from twisted.internet.protocol import Factory
</span><span class="cx"> Factory.noisy = False
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> def serviceMakerProperty(propname):
</span><span class="cx">     def getProperty(self):
</span><span class="cx">         return getattr(reflect.namedClass(self.serviceMakerClass), propname)
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldav__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavaccountingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/accounting.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/accounting.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/accounting.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavauthkerbpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/authkerb.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/authkerb.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/authkerb.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2001-2004 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavbackuppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/backup.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/backup.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/backup.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavbindpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/bind.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/bind.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/bind.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavcachepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/cache.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/cache.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/cache.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavcaldavxmlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/caldavxml.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/caldavxml.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/caldavxml.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> # #
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavcarddavxmlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/carddavxml.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/carddavxml.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/carddavxml.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavclient__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavclientgeturlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/geturl.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/geturl.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/geturl.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavclientpoolpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/pool.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/pool.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/pool.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavclientreverseproxypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/reverseproxy.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/reverseproxy.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/reverseproxy.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavclienttest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavclienttesttest_reverseproxypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/test/test_reverseproxy.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/test/test_reverseproxy.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/client/test/test_reverseproxy.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavconfigpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/config.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/config.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/config.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavcustomxmlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/customxml.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/customxml.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/customxml.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -76,7 +76,11 @@
</span><span class="cx">     &quot;calendarserver-home-sync&quot;,
</span><span class="cx"> )
</span><span class="cx"> 
</span><ins>+calendarserver_recurrence_split = (
+    &quot;calendarserver-recurrence-split&quot;,
+)
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx"> @registerElement
</span><span class="cx"> class TwistedCalendarSupportedComponents (WebDAVTextElement):
</span><span class="cx">     &quot;&quot;&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatabasepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/database.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/database.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/database.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafilters__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafiltersaddressdatapy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/addressdata.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/addressdata.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/addressdata.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafilterscalendardatapy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/calendardata.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/calendardata.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/calendardata.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafiltersfilterpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/filter.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/filter.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/filter.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafiltershiddeninstancepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/hiddeninstance.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/hiddeninstance.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/hiddeninstance.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafiltersperuserdatapy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/peruserdata.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/peruserdata.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/peruserdata.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafiltersprivateeventspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/privateevents.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/privateevents.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/privateevents.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafilterstest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafilterstesttest_calendardatapy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/test_calendardata.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/test_calendardata.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/test_calendardata.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafilterstesttest_hiddeninstancespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/test_hiddeninstances.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/test_hiddeninstances.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/test_hiddeninstances.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafilterstesttest_peruserdatapy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/test_peruserdata.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/test_peruserdata.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/test_peruserdata.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdatafilterstesttest_privateeventspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/test_privateevents.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/test_privateevents.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/datafilters/test/test_privateevents.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdateopspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/dateops.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/dateops.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/dateops.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectory__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryaddressbookpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/addressbook.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/addressbook.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/addressbook.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryaggregatepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/aggregate.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/aggregate.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/aggregate.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryappleopendirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/appleopendirectory.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/appleopendirectory.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/appleopendirectory.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.directory.test.test_opendirectory -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryaugmentpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/augment.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/augment.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/augment.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorycachingdirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/cachingdirectory.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/cachingdirectory.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/cachingdirectory.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.directory.test.test_cachedirectory -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorycalendarpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/calendar.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/calendar.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/calendar.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.directory.test.test_calendar -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorycalendaruserproxypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/calendaruserproxy.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/calendaruserproxy.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/calendaruserproxy.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.directory.test.test_proxyprincipalmembers -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorycalendaruserproxyloaderpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/calendaruserproxyloader.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/calendaruserproxyloader.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/calendaruserproxyloader.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorycommonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/common.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/common.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/common.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.test.test_wrapping,twistedcaldav.directory.test.test_calendar -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorydigestpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/digest.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/digest.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/digest.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.directory.test.test_digest -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorydirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/directory.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/directory.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/directory.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.directory.test -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryidirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/idirectory.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/idirectory.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/idirectory.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryinternalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/internal.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/internal.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/internal.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryldapdirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/ldapdirectory.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/ldapdirectory.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/ldapdirectory.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2008-2009 Aymeric Augustin. All rights reserved.
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -40,7 +40,8 @@
</span><span class="cx">     &quot;LdapDirectoryService&quot;,
</span><span class="cx"> ]
</span><span class="cx"> 
</span><del>-import ldap, ldap.async
</del><ins>+import ldap
+import ldap.async
</ins><span class="cx"> from ldap.filter import escape_filter_chars as ldapEsc
</span><span class="cx"> 
</span><span class="cx"> try:
</span><span class="lines">@@ -52,8 +53,9 @@
</span><span class="cx"> 
</span><span class="cx"> import time
</span><span class="cx"> from twisted.cred.credentials import UsernamePassword
</span><del>-from twistedcaldav.directory.cachingdirectory import (CachingDirectoryService,
-    CachingDirectoryRecord)
</del><ins>+from twistedcaldav.directory.cachingdirectory import (
+    CachingDirectoryService, CachingDirectoryRecord
+)
</ins><span class="cx"> from twistedcaldav.directory.directory import DirectoryConfigurationError
</span><span class="cx"> from twistedcaldav.directory.augment import AugmentRecord
</span><span class="cx"> from twistedcaldav.directory.util import splitIntoBatches, normalizeUUID
</span><span class="lines">@@ -63,6 +65,8 @@
</span><span class="cx"> from txweb2.http import HTTPError, StatusResponse
</span><span class="cx"> from txweb2 import responsecode
</span><span class="cx"> 
</span><ins>+
+
</ins><span class="cx"> class LdapDirectoryService(CachingDirectoryService):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     LDAP based implementation of L{IDirectoryService}.
</span><span class="lines">@@ -72,8 +76,9 @@
</span><span class="cx">     baseGUID = &quot;5A871574-0C86-44EE-B11B-B9440C3DC4DD&quot;
</span><span class="cx"> 
</span><span class="cx">     def __repr__(self):
</span><del>-        return &quot;&lt;%s %r: %r&gt;&quot; % (self.__class__.__name__, self.realmName,
-            self.uri)
</del><ins>+        return &quot;&lt;%s %r: %r&gt;&quot; % (
+            self.__class__.__name__, self.realmName, self.uri
+        )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def __init__(self, params):
</span><span class="lines">@@ -85,15 +90,15 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         defaults = {
</span><del>-            &quot;augmentService&quot; : None,
-            &quot;groupMembershipCache&quot; : None,
-            &quot;cacheTimeout&quot;: 1, # Minutes
</del><ins>+            &quot;augmentService&quot;: None,
+            &quot;groupMembershipCache&quot;: None,
+            &quot;cacheTimeout&quot;: 1,  # Minutes
</ins><span class="cx">             &quot;negativeCaching&quot;: False,
</span><span class="cx">             &quot;warningThresholdSeconds&quot;: 3,
</span><del>-            &quot;batchSize&quot;: 500, # for splitting up large queries
-            &quot;requestTimeoutSeconds&quot; : 10,
-            &quot;requestResultsLimit&quot; : 200,
-            &quot;optimizeMultiName&quot; : False,
</del><ins>+            &quot;batchSize&quot;: 500,  # for splitting up large queries
+            &quot;requestTimeoutSeconds&quot;: 10,
+            &quot;requestResultsLimit&quot;: 200,
+            &quot;optimizeMultiName&quot;: False,
</ins><span class="cx">             &quot;queryLocationsImplicitly&quot;: True,
</span><span class="cx">             &quot;restrictEnabledRecords&quot;: False,
</span><span class="cx">             &quot;restrictToGroup&quot;: &quot;&quot;,
</span><span class="lines">@@ -102,7 +107,7 @@
</span><span class="cx">             &quot;tls&quot;: False,
</span><span class="cx">             &quot;tlsCACertFile&quot;: None,
</span><span class="cx">             &quot;tlsCACertDir&quot;: None,
</span><del>-            &quot;tlsRequireCert&quot;: None, # never, allow, try, demand, hard
</del><ins>+            &quot;tlsRequireCert&quot;: None,  # never, allow, try, demand, hard
</ins><span class="cx">             &quot;credentials&quot;: {
</span><span class="cx">                 &quot;dn&quot;: None,
</span><span class="cx">                 &quot;password&quot;: None,
</span><span class="lines">@@ -113,68 +118,68 @@
</span><span class="cx">                 &quot;guidAttr&quot;: &quot;entryUUID&quot;,
</span><span class="cx">                 &quot;users&quot;: {
</span><span class="cx">                     &quot;rdn&quot;: &quot;ou=People&quot;,
</span><del>-                    &quot;filter&quot;: None, # additional filter for this type
-                    &quot;loginEnabledAttr&quot; : &quot;&quot;, # attribute controlling login
-                    &quot;loginEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                    &quot;calendarEnabledAttr&quot; : &quot;&quot;, # attribute controlling enabledForCalendaring
-                    &quot;calendarEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                    &quot;mapping&quot; : { # maps internal record names to LDAP
</del><ins>+                    &quot;filter&quot;: None,  # additional filter for this type
+                    &quot;loginEnabledAttr&quot;: &quot;&quot;,  # attribute controlling login
+                    &quot;loginEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                    &quot;calendarEnabledAttr&quot;: &quot;&quot;,  # attribute controlling enabledForCalendaring
+                    &quot;calendarEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                    &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                         &quot;recordName&quot;: &quot;uid&quot;,
</span><del>-                        &quot;fullName&quot; : &quot;cn&quot;,
-                        &quot;emailAddresses&quot; : [&quot;mail&quot;], # multiple LDAP fields supported
-                        &quot;firstName&quot; : &quot;givenName&quot;,
-                        &quot;lastName&quot; : &quot;sn&quot;,
</del><ins>+                        &quot;fullName&quot;: &quot;cn&quot;,
+                        &quot;emailAddresses&quot;: [&quot;mail&quot;],  # multiple LDAP fields supported
+                        &quot;firstName&quot;: &quot;givenName&quot;,
+                        &quot;lastName&quot;: &quot;sn&quot;,
</ins><span class="cx">                     },
</span><span class="cx">                 },
</span><span class="cx">                 &quot;groups&quot;: {
</span><span class="cx">                     &quot;rdn&quot;: &quot;ou=Group&quot;,
</span><del>-                    &quot;filter&quot;: None, # additional filter for this type
-                    &quot;mapping&quot; : { # maps internal record names to LDAP
</del><ins>+                    &quot;filter&quot;: None,  # additional filter for this type
+                    &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                         &quot;recordName&quot;: &quot;cn&quot;,
</span><del>-                        &quot;fullName&quot; : &quot;cn&quot;,
-                        &quot;emailAddresses&quot; : [&quot;mail&quot;], # multiple LDAP fields supported
-                        &quot;firstName&quot; : &quot;givenName&quot;,
-                        &quot;lastName&quot; : &quot;sn&quot;,
</del><ins>+                        &quot;fullName&quot;: &quot;cn&quot;,
+                        &quot;emailAddresses&quot;: [&quot;mail&quot;],  # multiple LDAP fields supported
+                        &quot;firstName&quot;: &quot;givenName&quot;,
+                        &quot;lastName&quot;: &quot;sn&quot;,
</ins><span class="cx">                     },
</span><span class="cx">                 },
</span><span class="cx">                 &quot;locations&quot;: {
</span><span class="cx">                     &quot;rdn&quot;: &quot;ou=Places&quot;,
</span><del>-                    &quot;filter&quot;: None, # additional filter for this type
-                    &quot;calendarEnabledAttr&quot; : &quot;&quot;, # attribute controlling enabledForCalendaring
-                    &quot;calendarEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                    &quot;associatedAddressAttr&quot; : &quot;&quot;,
-                    &quot;mapping&quot; : { # maps internal record names to LDAP
</del><ins>+                    &quot;filter&quot;: None,  # additional filter for this type
+                    &quot;calendarEnabledAttr&quot;: &quot;&quot;,  # attribute controlling enabledForCalendaring
+                    &quot;calendarEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                    &quot;associatedAddressAttr&quot;: &quot;&quot;,
+                    &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                         &quot;recordName&quot;: &quot;cn&quot;,
</span><del>-                        &quot;fullName&quot; : &quot;cn&quot;,
-                        &quot;emailAddresses&quot; : [&quot;mail&quot;], # multiple LDAP fields supported
</del><ins>+                        &quot;fullName&quot;: &quot;cn&quot;,
+                        &quot;emailAddresses&quot;: [&quot;mail&quot;],  # multiple LDAP fields supported
</ins><span class="cx">                     },
</span><span class="cx">                 },
</span><span class="cx">                 &quot;resources&quot;: {
</span><span class="cx">                     &quot;rdn&quot;: &quot;ou=Resources&quot;,
</span><del>-                    &quot;filter&quot;: None, # additional filter for this type
-                    &quot;calendarEnabledAttr&quot; : &quot;&quot;, # attribute controlling enabledForCalendaring
-                    &quot;calendarEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                    &quot;mapping&quot; : { # maps internal record names to LDAP
</del><ins>+                    &quot;filter&quot;: None,  # additional filter for this type
+                    &quot;calendarEnabledAttr&quot;: &quot;&quot;,  # attribute controlling enabledForCalendaring
+                    &quot;calendarEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                    &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                         &quot;recordName&quot;: &quot;cn&quot;,
</span><del>-                        &quot;fullName&quot; : &quot;cn&quot;,
-                        &quot;emailAddresses&quot; : [&quot;mail&quot;], # multiple LDAP fields supported
</del><ins>+                        &quot;fullName&quot;: &quot;cn&quot;,
+                        &quot;emailAddresses&quot;: [&quot;mail&quot;],  # multiple LDAP fields supported
</ins><span class="cx">                     },
</span><span class="cx">                 },
</span><span class="cx">                 &quot;addresses&quot;: {
</span><span class="cx">                     &quot;rdn&quot;: &quot;ou=Buildings&quot;,
</span><del>-                    &quot;filter&quot;: None, # additional filter for this type
-                    &quot;streetAddressAttr&quot; : &quot;&quot;,
-                    &quot;geoAttr&quot; : &quot;&quot;,
-                    &quot;mapping&quot; : { # maps internal record names to LDAP
</del><ins>+                    &quot;filter&quot;: None,  # additional filter for this type
+                    &quot;streetAddressAttr&quot;: &quot;&quot;,
+                    &quot;geoAttr&quot;: &quot;&quot;,
+                    &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                         &quot;recordName&quot;: &quot;cn&quot;,
</span><del>-                        &quot;fullName&quot; : &quot;cn&quot;,
</del><ins>+                        &quot;fullName&quot;: &quot;cn&quot;,
</ins><span class="cx">                     },
</span><span class="cx">                 },
</span><span class="cx">             },
</span><span class="cx">             &quot;groupSchema&quot;: {
</span><del>-                &quot;membersAttr&quot;: &quot;member&quot;, # how members are specified
-                &quot;nestedGroupsAttr&quot;: None, # how nested groups are specified
-                &quot;memberIdAttr&quot;: None, # which attribute the above refer to (None means use DN)
</del><ins>+                &quot;membersAttr&quot;: &quot;member&quot;,  # how members are specified
+                &quot;nestedGroupsAttr&quot;: None,  # how nested groups are specified
+                &quot;memberIdAttr&quot;: None,  # which attribute the above refer to (None means use DN)
</ins><span class="cx">             },
</span><span class="cx">             &quot;resourceSchema&quot;: {
</span><span class="cx">                 # Either set this attribute to retrieve the plist version
</span><span class="lines">@@ -184,12 +189,12 @@
</span><span class="cx">                 # individually:
</span><span class="cx">                 &quot;autoScheduleAttr&quot;: None,
</span><span class="cx">                 &quot;autoScheduleEnabledValue&quot;: &quot;yes&quot;,
</span><del>-                &quot;proxyAttr&quot;: None, # list of GUIDs
-                &quot;readOnlyProxyAttr&quot;: None, # list of GUIDs
-                &quot;autoAcceptGroupAttr&quot;: None, # single group GUID
</del><ins>+                &quot;proxyAttr&quot;: None,  # list of GUIDs
+                &quot;readOnlyProxyAttr&quot;: None,  # list of GUIDs
+                &quot;autoAcceptGroupAttr&quot;: None,  # single group GUID
</ins><span class="cx">             },
</span><span class="cx">             &quot;poddingSchema&quot;: {
</span><del>-                &quot;serverIdAttr&quot;: None, # maps to augments server-id
</del><ins>+                &quot;serverIdAttr&quot;: None,  # maps to augments server-id
</ins><span class="cx">             },
</span><span class="cx">         }
</span><span class="cx">         ignored = None
</span><span class="lines">@@ -238,7 +243,7 @@
</span><span class="cx">             if self.rdnSchema[recordType][&quot;attr&quot;]:
</span><span class="cx">                 attrSet.add(self.rdnSchema[recordType][&quot;attr&quot;])
</span><span class="cx">             for n in (&quot;calendarEnabledAttr&quot;, &quot;associatedAddressAttr&quot;,
</span><del>-                &quot;streetAddressAttr&quot;, &quot;geoAttr&quot;):
</del><ins>+                      &quot;streetAddressAttr&quot;, &quot;geoAttr&quot;):
</ins><span class="cx">                 if self.rdnSchema[recordType].get(n, False):
</span><span class="cx">                     attrSet.add(self.rdnSchema[recordType][n])
</span><span class="cx">             for attrList in self.rdnSchema[recordType][&quot;mapping&quot;].values():
</span><span class="lines">@@ -311,15 +316,16 @@
</span><span class="cx"> 
</span><span class="cx">         # Query the LDAP server
</span><span class="cx">         self.log.debug(&quot;Querying ldap for records matching base {base} and &quot;
</span><del>-            &quot;filter {filter} for attributes {attrs}.&quot;,
-            base=ldap.dn.dn2str(base), filter=filterstr, attrs=self.attrlist)
</del><ins>+                       &quot;filter {filter} for attributes {attrs}.&quot;,
+                       base=ldap.dn.dn2str(base), filter=filterstr,
+                       attrs=self.attrlist)
</ins><span class="cx"> 
</span><span class="cx">         # This takes a while, so if you don't want to have a &quot;long request&quot;
</span><span class="cx">         # warning logged, use this instead of timedSearch:
</span><span class="cx">         # results = self.ldap.search_s(ldap.dn.dn2str(base),
</span><span class="cx">         #     ldap.SCOPE_SUBTREE, filterstr=filterstr, attrlist=self.attrlist)
</span><del>-        results = self.timedSearch(ldap.dn.dn2str(base),
-            ldap.SCOPE_SUBTREE, filterstr=filterstr, attrlist=self.attrlist)
</del><ins>+        results = self.timedSearch(ldap.dn.dn2str(base), ldap.SCOPE_SUBTREE,
+                                   filterstr=filterstr, attrlist=self.attrlist)
</ins><span class="cx"> 
</span><span class="cx">         records = []
</span><span class="cx">         numMissingGuids = 0
</span><span class="lines">@@ -337,7 +343,8 @@
</span><span class="cx">                 continue
</span><span class="cx"> 
</span><span class="cx">             if not unrestricted:
</span><del>-                self.log.debug(&quot;{dn} is not enabled because it's not a member of group: {group}&quot;,
</del><ins>+                self.log.debug(
+                    &quot;{dn} is not enabled because it's not a member of group: {group}&quot;,
</ins><span class="cx">                     dn=dn, group=self.restrictToGroup)
</span><span class="cx">                 record.enabledForCalendaring = False
</span><span class="cx">                 record.enabledForAddressBooks = False
</span><span class="lines">@@ -346,7 +353,8 @@
</span><span class="cx"> 
</span><span class="cx">         if numMissingGuids:
</span><span class="cx">             self.log.info(&quot;{num} {recordType} records are missing {attr}&quot;,
</span><del>-                num=numMissingGuids, recordType=recordType, attr=guidAttr)
</del><ins>+                          num=numMissingGuids, recordType=recordType,
+                          attr=guidAttr)
</ins><span class="cx"> 
</span><span class="cx">         return records
</span><span class="cx"> 
</span><span class="lines">@@ -400,11 +408,13 @@
</span><span class="cx"> 
</span><span class="cx">         # Query the LDAP server
</span><span class="cx">         self.log.debug(&quot;Querying ldap for records matching base {base} and &quot;
</span><del>-            &quot;filter {filter} for attributes {attrs}.&quot;,
-            base=ldap.dn.dn2str(self.base), filter=filterstr, attrs=attrlist)
</del><ins>+                       &quot;filter {filter} for attributes {attrs}.&quot;,
+                       base=ldap.dn.dn2str(self.base), filter=filterstr,
+                       attrs=attrlist)
</ins><span class="cx"> 
</span><span class="cx">         results = self.timedSearch(ldap.dn.dn2str(self.base),
</span><del>-            ldap.SCOPE_SUBTREE, filterstr=filterstr, attrlist=attrlist)
</del><ins>+                                   ldap.SCOPE_SUBTREE, filterstr=filterstr,
+                                   attrlist=attrlist)
</ins><span class="cx"> 
</span><span class="cx">         for dn, attrs in results:
</span><span class="cx">             dn = normalizeDNstr(dn)
</span><span class="lines">@@ -415,12 +425,12 @@
</span><span class="cx">                 if readDelegate:
</span><span class="cx">                     readDelegate = normalizeUUID(readDelegate)
</span><span class="cx">                     assignments.append((&quot;%s#calendar-proxy-read&quot; % (guid,),
</span><del>-                        [readDelegate]))
</del><ins>+                                       [readDelegate]))
</ins><span class="cx">                 writeDelegate = self._getUniqueLdapAttribute(attrs, writeAttr)
</span><span class="cx">                 if writeDelegate:
</span><span class="cx">                     writeDelegate = normalizeUUID(writeDelegate)
</span><span class="cx">                     assignments.append((&quot;%s#calendar-proxy-write&quot; % (guid,),
</span><del>-                        [writeDelegate]))
</del><ins>+                                       [writeDelegate]))
</ins><span class="cx"> 
</span><span class="cx">         return assignments
</span><span class="cx"> 
</span><span class="lines">@@ -433,11 +443,11 @@
</span><span class="cx">             if self.credentials.get(&quot;dn&quot;, &quot;&quot;):
</span><span class="cx">                 try:
</span><span class="cx">                     self.log.info(&quot;Binding to LDAP {dn}&quot;,
</span><del>-                        dn=repr(self.credentials.get(&quot;dn&quot;)))
</del><ins>+                                  dn=repr(self.credentials.get(&quot;dn&quot;)))
</ins><span class="cx">                     self.ldap.simple_bind_s(self.credentials.get(&quot;dn&quot;),
</span><del>-                        self.credentials.get(&quot;password&quot;))
</del><ins>+                                            self.credentials.get(&quot;password&quot;))
</ins><span class="cx">                     self.log.info(&quot;Successfully authenticated with LDAP as {dn}&quot;,
</span><del>-                        dn=repr(self.credentials.get(&quot;dn&quot;)))
</del><ins>+                                  dn=repr(self.credentials.get(&quot;dn&quot;)))
</ins><span class="cx">                 except ldap.INVALID_CREDENTIALS:
</span><span class="cx">                     self.log.error(&quot;Can't bind to LDAP {uri}: check credentials&quot;, uri=self.uri)
</span><span class="cx">                     raise DirectoryConfigurationError()
</span><span class="lines">@@ -498,7 +508,7 @@
</span><span class="cx"> 
</span><span class="cx">             except ldap.NO_SUCH_OBJECT:
</span><span class="cx">                 self.log.error(&quot;LDAP Authentication error for %s: NO_SUCH_OBJECT&quot;
</span><del>-                    % (dn,))
</del><ins>+                               % (dn,))
</ins><span class="cx">                 # fall through to try again; could be transient
</span><span class="cx"> 
</span><span class="cx">             except ldap.INVALID_CREDENTIALS:
</span><span class="lines">@@ -526,7 +536,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def timedSearch(self, base, scope, filterstr=&quot;(objectClass=*)&quot;,
</span><del>-        attrlist=None, timeoutSeconds=-1, resultLimit=0):
</del><ins>+                    attrlist=None, timeoutSeconds=-1, resultLimit=0):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Execute an LDAP query, retrying up to 3 times in case the LDAP server has
</span><span class="cx">         gone down and we need to reconnect. If it takes longer than the configured
</span><span class="lines">@@ -541,8 +551,7 @@
</span><span class="cx">             try:
</span><span class="cx">                 s = ldap.async.List(self.getLDAPConnection())
</span><span class="cx">                 s.startSearch(base, scope, filterstr, attrList=attrlist,
</span><del>-                    timeout=timeoutSeconds,
-                    sizelimit=resultLimit)
</del><ins>+                              timeout=timeoutSeconds, sizelimit=resultLimit)
</ins><span class="cx">                 startTime = time.time()
</span><span class="cx">                 s.processResults()
</span><span class="cx">             except ldap.NO_SUCH_OBJECT:
</span><span class="lines">@@ -566,8 +575,10 @@
</span><span class="cx">             if totalTime &gt; self.warningThresholdSeconds:
</span><span class="cx">                 if filterstr and len(filterstr) &gt; 100:
</span><span class="cx">                     filterstr = &quot;%s...&quot; % (filterstr[:100],)
</span><del>-                self.log.error(&quot;LDAP query exceeded threshold: %.2f seconds for %s %s %s (#results=%d)&quot; %
-                    (totalTime, base, filterstr, attrlist, len(result)))
</del><ins>+                self.log.error(
+                    &quot;LDAP query exceeded threshold: %.2f seconds for %s %s %s (#results=%d)&quot; %
+                    (totalTime, base, filterstr, attrlist, len(result))
+                )
</ins><span class="cx">             return result
</span><span class="cx"> 
</span><span class="cx">         raise HTTPError(StatusResponse(responsecode.SERVICE_UNAVAILABLE, &quot;LDAP server unavailable&quot;))
</span><span class="lines">@@ -589,7 +600,7 @@
</span><span class="cx">             return True
</span><span class="cx">         if self.groupSchema[&quot;memberIdAttr&quot;]:
</span><span class="cx">             value = self._getUniqueLdapAttribute(attrs, self.groupSchema[&quot;memberIdAttr&quot;])
</span><del>-        else: # No memberIdAttr implies DN
</del><ins>+        else:  # No memberIdAttr implies DN
</ins><span class="cx">             value = dn
</span><span class="cx">         return value in self.restrictedPrincipals
</span><span class="cx"> 
</span><span class="lines">@@ -610,9 +621,11 @@
</span><span class="cx">                 # TODO: This shouldn't be hardcoded to cn
</span><span class="cx">                 filterstr = &quot;(cn=%s)&quot; % (self.restrictToGroup,)
</span><span class="cx">                 self.log.debug(&quot;Retrieving ldap record with base %s and filter %s.&quot; %
</span><del>-                    (ldap.dn.dn2str(base), filterstr))
</del><ins>+                               (ldap.dn.dn2str(base), filterstr))
</ins><span class="cx">                 result = self.timedSearch(ldap.dn.dn2str(base),
</span><del>-                    ldap.SCOPE_SUBTREE, filterstr=filterstr, attrlist=self.attrlist)
</del><ins>+                                          ldap.SCOPE_SUBTREE,
+                                          filterstr=filterstr,
+                                          attrlist=self.attrlist)
</ins><span class="cx"> 
</span><span class="cx">                 members = []
</span><span class="cx">                 nestedGroups = []
</span><span class="lines">@@ -621,16 +634,20 @@
</span><span class="cx">                     dn, attrs = result[0]
</span><span class="cx">                     dn = normalizeDNstr(dn)
</span><span class="cx">                     if self.groupSchema[&quot;membersAttr&quot;]:
</span><del>-                        members = self._getMultipleLdapAttributes(attrs,
-                            self.groupSchema[&quot;membersAttr&quot;])
-                        if not self.groupSchema[&quot;memberIdAttr&quot;]: # these are DNs
</del><ins>+                        members = self._getMultipleLdapAttributes(
+                            attrs,
+                            self.groupSchema[&quot;membersAttr&quot;]
+                        )
+                        if not self.groupSchema[&quot;memberIdAttr&quot;]:  # these are DNs
</ins><span class="cx">                             members = [normalizeDNstr(m) for m in members]
</span><span class="cx">                         members = set(members)
</span><span class="cx"> 
</span><span class="cx">                     if self.groupSchema[&quot;nestedGroupsAttr&quot;]:
</span><del>-                        nestedGroups = self._getMultipleLdapAttributes(attrs,
-                            self.groupSchema[&quot;nestedGroupsAttr&quot;])
-                        if not self.groupSchema[&quot;memberIdAttr&quot;]: # these are DNs
</del><ins>+                        nestedGroups = self._getMultipleLdapAttributes(
+                            attrs,
+                            self.groupSchema[&quot;nestedGroupsAttr&quot;]
+                        )
+                        if not self.groupSchema[&quot;memberIdAttr&quot;]:  # these are DNs
</ins><span class="cx">                             nestedGroups = [normalizeDNstr(g) for g in nestedGroups]
</span><span class="cx">                         nestedGroups = set(nestedGroups)
</span><span class="cx">                     else:
</span><span class="lines">@@ -639,8 +656,9 @@
</span><span class="cx">                         nestedGroups = members
</span><span class="cx">                         members = set()
</span><span class="cx"> 
</span><del>-                self._cachedRestrictedPrincipals = set(self._expandGroupMembership(members,
-                    nestedGroups))
</del><ins>+                self._cachedRestrictedPrincipals = set(
+                    self._expandGroupMembership(members, nestedGroups)
+                )
</ins><span class="cx">                 self.log.info(&quot;Got %d restricted group members&quot; % (
</span><span class="cx">                     len(self._cachedRestrictedPrincipals),))
</span><span class="cx">                 self.restrictedTimestamp = time.time()
</span><span class="lines">@@ -695,15 +713,17 @@
</span><span class="cx">                 scope = ldap.SCOPE_SUBTREE
</span><span class="cx">                 base = self.typeDNs[recordType]
</span><span class="cx">                 filterstr = &quot;(%s=%s)&quot; % (self.groupSchema[&quot;memberIdAttr&quot;], group)
</span><del>-            else: # Use DN
</del><ins>+            else:  # Use DN
</ins><span class="cx">                 scope = ldap.SCOPE_BASE
</span><span class="cx">                 base = ldap.dn.str2dn(group)
</span><span class="cx">                 filterstr = &quot;(objectClass=*)&quot;
</span><span class="cx"> 
</span><span class="cx">             self.log.debug(&quot;Retrieving ldap record with base %s and filter %s.&quot; %
</span><del>-                (ldap.dn.dn2str(base), filterstr))
</del><ins>+                           (ldap.dn.dn2str(base), filterstr))
</ins><span class="cx">             result = self.timedSearch(ldap.dn.dn2str(base),
</span><del>-                scope, filterstr=filterstr, attrlist=self.attrlist)
</del><ins>+                                      scope,
+                                      filterstr=filterstr,
+                                      attrlist=self.attrlist)
</ins><span class="cx"> 
</span><span class="cx">             if len(result) == 0:
</span><span class="cx">                 continue
</span><span class="lines">@@ -714,24 +734,29 @@
</span><span class="cx">                 dn, attrs = result[0]
</span><span class="cx">                 dn = normalizeDNstr(dn)
</span><span class="cx">                 if self.groupSchema[&quot;membersAttr&quot;]:
</span><del>-                    subMembers = self._getMultipleLdapAttributes(attrs,
-                        self.groupSchema[&quot;membersAttr&quot;])
-                    if not self.groupSchema[&quot;memberIdAttr&quot;]: # these are DNs
</del><ins>+                    subMembers = self._getMultipleLdapAttributes(
+                        attrs,
+                        self.groupSchema[&quot;membersAttr&quot;]
+                    )
+                    if not self.groupSchema[&quot;memberIdAttr&quot;]:  # these are DNs
</ins><span class="cx">                         subMembers = [normalizeDNstr(m) for m in subMembers]
</span><span class="cx">                     subMembers = set(subMembers)
</span><span class="cx"> 
</span><span class="cx">                 if self.groupSchema[&quot;nestedGroupsAttr&quot;]:
</span><del>-                    subNestedGroups = self._getMultipleLdapAttributes(attrs,
-                        self.groupSchema[&quot;nestedGroupsAttr&quot;])
-                    if not self.groupSchema[&quot;memberIdAttr&quot;]: # these are DNs
</del><ins>+                    subNestedGroups = self._getMultipleLdapAttributes(
+                        attrs,
+                        self.groupSchema[&quot;nestedGroupsAttr&quot;]
+                    )
+                    if not self.groupSchema[&quot;memberIdAttr&quot;]:  # these are DNs
</ins><span class="cx">                         subNestedGroups = [normalizeDNstr(g) for g in subNestedGroups]
</span><span class="cx">                     subNestedGroups = set(subNestedGroups)
</span><span class="cx"> 
</span><span class="cx">             processedItems.add(group)
</span><span class="cx">             yield group
</span><span class="cx"> 
</span><del>-            for item in self._expandGroupMembership(subMembers, subNestedGroups,
-                processedItems):
</del><ins>+            for item in self._expandGroupMembership(subMembers,
+                                                    subNestedGroups,
+                                                    processedItems):
</ins><span class="cx">                 yield item
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -805,8 +830,10 @@
</span><span class="cx">         emailSuffix = self.rdnSchema[recordType].get(&quot;emailSuffix&quot;, None)
</span><span class="cx"> 
</span><span class="cx">         if len(emailAddresses) == 0 and emailSuffix:
</span><del>-            emailPrefix = self._getUniqueLdapAttribute(attrs,
-                self.rdnSchema[recordType].get(&quot;attr&quot;, &quot;cn&quot;))
</del><ins>+            emailPrefix = self._getUniqueLdapAttribute(
+                attrs,
+                self.rdnSchema[recordType].get(&quot;attr&quot;, &quot;cn&quot;)
+            )
</ins><span class="cx">             emailAddresses.add(emailPrefix + emailSuffix)
</span><span class="cx"> 
</span><span class="cx">         proxyGUIDs = ()
</span><span class="lines">@@ -837,7 +864,7 @@
</span><span class="cx">                 memberGUIDs.extend(members)
</span><span class="cx"> 
</span><span class="cx">             # Normalize members if they're in DN form
</span><del>-            if not self.groupSchema[&quot;memberIdAttr&quot;]: # empty = dn
</del><ins>+            if not self.groupSchema[&quot;memberIdAttr&quot;]:  # empty = dn
</ins><span class="cx">                 guids = list(memberGUIDs)
</span><span class="cx">                 memberGUIDs = []
</span><span class="cx">                 for dnStr in guids:
</span><span class="lines">@@ -849,14 +876,16 @@
</span><span class="cx">                         self.log.warn(&quot;Bad LDAP DN: %s&quot; % (dnStr,))
</span><span class="cx"> 
</span><span class="cx">         elif recordType in (self.recordType_resources,
</span><del>-            self.recordType_locations):
</del><ins>+                            self.recordType_locations):
</ins><span class="cx">             fullName = self._getUniqueLdapAttribute(attrs, self.rdnSchema[recordType][&quot;mapping&quot;][&quot;fullName&quot;])
</span><span class="cx">             enabledForCalendaring = True
</span><span class="cx">             enabledForAddressBooks = False
</span><span class="cx">             enabledForLogin = False
</span><span class="cx">             if self.resourceSchema[&quot;resourceInfoAttr&quot;]:
</span><del>-                resourceInfo = self._getUniqueLdapAttribute(attrs,
-                    self.resourceSchema[&quot;resourceInfoAttr&quot;])
</del><ins>+                resourceInfo = self._getUniqueLdapAttribute(
+                    attrs,
+                    self.resourceSchema[&quot;resourceInfoAttr&quot;]
+                )
</ins><span class="cx">                 if resourceInfo:
</span><span class="cx">                     try:
</span><span class="cx">                         (
</span><span class="lines">@@ -876,45 +905,66 @@
</span><span class="cx">                             readOnlyProxyGUIDs = (readOnlyProxy,)
</span><span class="cx">                     except ValueError, e:
</span><span class="cx">                         self.log.error(&quot;Unable to parse resource info (%s)&quot; % (e,))
</span><del>-            else: # the individual resource attributes might be specified
</del><ins>+            else:  # the individual resource attributes might be specified
</ins><span class="cx">                 if self.resourceSchema[&quot;autoScheduleAttr&quot;]:
</span><del>-                    autoScheduleValue = self._getUniqueLdapAttribute(attrs,
-                        self.resourceSchema[&quot;autoScheduleAttr&quot;])
-                    autoSchedule = (autoScheduleValue ==
-                        self.resourceSchema[&quot;autoScheduleEnabledValue&quot;])
</del><ins>+                    autoScheduleValue = self._getUniqueLdapAttribute(
+                        attrs,
+                        self.resourceSchema[&quot;autoScheduleAttr&quot;]
+                    )
+                    autoSchedule = (
+                        autoScheduleValue == self.resourceSchema[&quot;autoScheduleEnabledValue&quot;]
+                    )
</ins><span class="cx">                 if self.resourceSchema[&quot;proxyAttr&quot;]:
</span><del>-                    proxyGUIDs = set(self._getMultipleLdapAttributes(attrs,
-                        self.resourceSchema[&quot;proxyAttr&quot;]))
</del><ins>+                    proxyGUIDs = set(
+                        self._getMultipleLdapAttributes(
+                            attrs,
+                            self.resourceSchema[&quot;proxyAttr&quot;]
+                        )
+                    )
</ins><span class="cx">                 if self.resourceSchema[&quot;readOnlyProxyAttr&quot;]:
</span><del>-                    readOnlyProxyGUIDs = set(self._getMultipleLdapAttributes(attrs,
-                        self.resourceSchema[&quot;readOnlyProxyAttr&quot;]))
</del><ins>+                    readOnlyProxyGUIDs = set(
+                        self._getMultipleLdapAttributes(
+                            attrs,
+                            self.resourceSchema[&quot;readOnlyProxyAttr&quot;]
+                        )
+                    )
</ins><span class="cx">                 if self.resourceSchema[&quot;autoAcceptGroupAttr&quot;]:
</span><del>-                    autoAcceptGroup = self._getUniqueLdapAttribute(attrs,
-                        self.resourceSchema[&quot;autoAcceptGroupAttr&quot;])
</del><ins>+                    autoAcceptGroup = self._getUniqueLdapAttribute(
+                        attrs,
+                        self.resourceSchema[&quot;autoAcceptGroupAttr&quot;]
+                    )
</ins><span class="cx"> 
</span><span class="cx">             if recordType == self.recordType_locations:
</span><span class="cx">                 if self.rdnSchema[recordType][&quot;associatedAddressAttr&quot;]:
</span><del>-                    associatedAddress = self._getUniqueLdapAttribute(attrs,
-                        self.rdnSchema[recordType][&quot;associatedAddressAttr&quot;])
</del><ins>+                    associatedAddress = self._getUniqueLdapAttribute(
+                        attrs,
+                        self.rdnSchema[recordType][&quot;associatedAddressAttr&quot;]
+                    )
</ins><span class="cx">                     if associatedAddress:
</span><span class="cx">                         extras[&quot;associatedAddress&quot;] = associatedAddress
</span><span class="cx"> 
</span><span class="cx">         elif recordType == self.recordType_addresses:
</span><span class="cx">             if self.rdnSchema[recordType].get(&quot;geoAttr&quot;, &quot;&quot;):
</span><del>-                geo = self._getUniqueLdapAttribute(attrs,
-                    self.rdnSchema[recordType][&quot;geoAttr&quot;])
</del><ins>+                geo = self._getUniqueLdapAttribute(
+                    attrs,
+                    self.rdnSchema[recordType][&quot;geoAttr&quot;]
+                )
</ins><span class="cx">                 if geo:
</span><span class="cx">                     extras[&quot;geo&quot;] = geo
</span><span class="cx">             if self.rdnSchema[recordType].get(&quot;streetAddressAttr&quot;, &quot;&quot;):
</span><del>-                street = self._getUniqueLdapAttribute(attrs,
-                    self.rdnSchema[recordType][&quot;streetAddressAttr&quot;])
</del><ins>+                street = self._getUniqueLdapAttribute(
+                    attrs,
+                    self.rdnSchema[recordType][&quot;streetAddressAttr&quot;]
+                )
</ins><span class="cx">                 if street:
</span><span class="cx">                     extras[&quot;streetAddress&quot;] = street
</span><span class="cx"> 
</span><span class="cx">         serverID = None
</span><span class="cx">         if self.poddingSchema[&quot;serverIdAttr&quot;]:
</span><del>-            serverID = self._getUniqueLdapAttribute(attrs,
-                self.poddingSchema[&quot;serverIdAttr&quot;])
</del><ins>+            serverID = self._getUniqueLdapAttribute(
+                attrs,
+                self.poddingSchema[&quot;serverIdAttr&quot;]
+            )
</ins><span class="cx"> 
</span><span class="cx">         record = LdapDirectoryRecord(
</span><span class="cx">             service=self,
</span><span class="lines">@@ -940,8 +990,7 @@
</span><span class="cx">             # TODO: this needs to be deferred but for now we hard code
</span><span class="cx">             # the deferred result because we know it is completing
</span><span class="cx">             # immediately.
</span><del>-            d = self.augmentService.getAugmentRecord(record.guid,
-                recordType)
</del><ins>+            d = self.augmentService.getAugmentRecord(record.guid, recordType)
</ins><span class="cx">             d.addCallback(lambda x: record.addAugmentInformation(x))
</span><span class="cx"> 
</span><span class="cx">         else:
</span><span class="lines">@@ -953,7 +1002,7 @@
</span><span class="cx">                 enabledForCalendaring=enabledForCalendaring,
</span><span class="cx">                 autoSchedule=autoSchedule,
</span><span class="cx">                 autoAcceptGroup=autoAcceptGroup,
</span><del>-                enabledForAddressBooks=enabledForAddressBooks, # TODO: add to LDAP?
</del><ins>+                enabledForAddressBooks=enabledForAddressBooks,  # TODO: add to LDAP?
</ins><span class="cx">                 enabledForLogin=enabledForLogin,
</span><span class="cx">             )
</span><span class="cx">             record.addAugmentInformation(augmentRecord)
</span><span class="lines">@@ -963,15 +1012,18 @@
</span><span class="cx">             loginEnabledAttr = self.rdnSchema[recordType][&quot;loginEnabledAttr&quot;]
</span><span class="cx">             if loginEnabledAttr:
</span><span class="cx">                 loginEnabledValue = self.rdnSchema[recordType][&quot;loginEnabledValue&quot;]
</span><del>-                record.enabledForLogin = self._getUniqueLdapAttribute(attrs,
-                    loginEnabledAttr) == loginEnabledValue
</del><ins>+                record.enabledForLogin = self._getUniqueLdapAttribute(
+                    attrs, loginEnabledAttr
+                ) == loginEnabledValue
</ins><span class="cx"> 
</span><span class="cx">         # Override with LDAP calendar-enabled control if attribute specified
</span><span class="cx">         calendarEnabledAttr = self.rdnSchema[recordType].get(&quot;calendarEnabledAttr&quot;, &quot;&quot;)
</span><span class="cx">         if calendarEnabledAttr:
</span><span class="cx">             calendarEnabledValue = self.rdnSchema[recordType][&quot;calendarEnabledValue&quot;]
</span><del>-            record.enabledForCalendaring = self._getUniqueLdapAttribute(attrs,
-                calendarEnabledAttr) == calendarEnabledValue
</del><ins>+            record.enabledForCalendaring = self._getUniqueLdapAttribute(
+                attrs,
+                calendarEnabledAttr
+            ) == calendarEnabledValue
</ins><span class="cx"> 
</span><span class="cx">         return record
</span><span class="cx"> 
</span><span class="lines">@@ -994,7 +1046,7 @@
</span><span class="cx">             queryMethod = self.timedSearch
</span><span class="cx"> 
</span><span class="cx">         self.log.debug(&quot;LDAP query for types %s, indexType %s and indexKey %s&quot;
</span><del>-            % (recordTypes, indexType, indexKey))
</del><ins>+                       % (recordTypes, indexType, indexKey))
</ins><span class="cx"> 
</span><span class="cx">         guidAttr = self.rdnSchema[&quot;guidAttr&quot;]
</span><span class="cx">         for recordType in recordTypes:
</span><span class="lines">@@ -1024,7 +1076,7 @@
</span><span class="cx"> 
</span><span class="cx">             elif indexType == self.INDEX_TYPE_CUA:
</span><span class="cx">                 # indexKey is of the form &quot;mailto:test@example.net&quot;
</span><del>-                email = indexKey[7:] # strip &quot;mailto:&quot;
</del><ins>+                email = indexKey[7:]  # strip &quot;mailto:&quot;
</ins><span class="cx">                 emailSuffix = self.rdnSchema[recordType].get(&quot;emailSuffix&quot;, None)
</span><span class="cx">                 if emailSuffix is not None and email.partition(&quot;@&quot;)[2] == emailSuffix:
</span><span class="cx">                     filterstr = &quot;(&amp;%s(|(&amp;(!(mail=*))(%s=%s))(mail=%s)))&quot; % (
</span><span class="lines">@@ -1040,7 +1092,7 @@
</span><span class="cx">                         if ldapFields:
</span><span class="cx">                             subfilter = &quot;(%s=%s)&quot; % (ldapFields, ldapEsc(email))
</span><span class="cx">                         else:
</span><del>-                            continue # No LDAP attribute assigned for emailAddresses
</del><ins>+                            continue  # No LDAP attribute assigned for emailAddresses
</ins><span class="cx"> 
</span><span class="cx">                     else:
</span><span class="cx">                         subfilter = []
</span><span class="lines">@@ -1048,7 +1100,7 @@
</span><span class="cx">                             if ldapField:
</span><span class="cx">                                 subfilter.append(&quot;(%s=%s)&quot; % (ldapField, ldapEsc(email)))
</span><span class="cx">                         if not subfilter:
</span><del>-                            continue # No LDAP attribute assigned for emailAddresses
</del><ins>+                            continue  # No LDAP attribute assigned for emailAddresses
</ins><span class="cx"> 
</span><span class="cx">                         subfilter = &quot;(|%s)&quot; % (&quot;&quot;.join(subfilter))
</span><span class="cx">                     filterstr = &quot;(&amp;%s%s)&quot; % (filterstr, subfilter)
</span><span class="lines">@@ -1058,9 +1110,11 @@
</span><span class="cx"> 
</span><span class="cx">             # Query the LDAP server
</span><span class="cx">             self.log.debug(&quot;Retrieving ldap record with base %s and filter %s.&quot; %
</span><del>-                (ldap.dn.dn2str(base), filterstr))
</del><ins>+                           (ldap.dn.dn2str(base), filterstr))
</ins><span class="cx">             result = queryMethod(ldap.dn.dn2str(base),
</span><del>-                ldap.SCOPE_SUBTREE, filterstr=filterstr, attrlist=self.attrlist)
</del><ins>+                                 ldap.SCOPE_SUBTREE,
+                                 filterstr=filterstr,
+                                 attrlist=self.attrlist)
</ins><span class="cx"> 
</span><span class="cx">             if result:
</span><span class="cx">                 dn, attrs = result.pop()
</span><span class="lines">@@ -1079,20 +1133,26 @@
</span><span class="cx"> 
</span><span class="cx">                     record.applySACLs()
</span><span class="cx"> 
</span><del>-                    self.recordCacheForType(recordType).addRecord(record,
-                        indexType, indexKey
</del><ins>+                    self.recordCacheForType(recordType).addRecord(
+                        record, indexType, indexKey
</ins><span class="cx">                     )
</span><span class="cx"> 
</span><span class="cx">                     # We got a match, so don't bother checking other types
</span><span class="cx">                     break
</span><span class="cx"> 
</span><span class="cx">                 except MissingRecordNameException:
</span><del>-                    self.log.warn(&quot;Ignoring record missing record name attribute: recordType %s, indexType %s and indexKey %s&quot;
-                        % (recordTypes, indexType, indexKey))
</del><ins>+                    self.log.warn(
+                        &quot;Ignoring record missing record name &quot;
+                        &quot;attribute: recordType %s, indexType %s and indexKey %s&quot;
+                        % (recordTypes, indexType, indexKey)
+                    )
</ins><span class="cx"> 
</span><span class="cx">                 except MissingGuidException:
</span><del>-                    self.log.warn(&quot;Ignoring record missing guid attribute: recordType %s, indexType %s and indexKey %s&quot;
-                        % (recordTypes, indexType, indexKey))
</del><ins>+                    self.log.warn(
+                        &quot;Ignoring record missing guid attribute: &quot;
+                        &quot;recordType %s, indexType %s and indexKey %s&quot;
+                        % (recordTypes, indexType, indexKey)
+                    )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def recordsMatchingTokens(self, tokens, context=None, limitResults=50, timeoutSeconds=10):
</span><span class="lines">@@ -1131,17 +1191,27 @@
</span><span class="cx">             base = self.typeDNs[recordType]
</span><span class="cx">             scope = ldap.SCOPE_SUBTREE
</span><span class="cx">             extraFilter = self.rdnSchema[recordType].get(&quot;filter&quot;, &quot;&quot;)
</span><del>-            filterstr = buildFilterFromTokens(recordType, self.rdnSchema[recordType][&quot;mapping&quot;],
-                tokens, extra=extraFilter)
</del><ins>+            filterstr = buildFilterFromTokens(
+                recordType,
+                self.rdnSchema[recordType][&quot;mapping&quot;],
+                tokens,
+                extra=extraFilter
+            )
</ins><span class="cx"> 
</span><span class="cx">             if filterstr is not None:
</span><span class="cx">                 # Query the LDAP server
</span><del>-                self.log.debug(&quot;LDAP search %s %s (limit=%d)&quot; %
-                    (ldap.dn.dn2str(base), filterstr, limitResults))
-                results = self.timedSearch(ldap.dn.dn2str(base), scope,
-                    filterstr=filterstr, attrlist=self.attrlist,
</del><ins>+                self.log.debug(
+                    &quot;LDAP search %s %s (limit=%d)&quot; %
+                    (ldap.dn.dn2str(base), filterstr, limitResults)
+                )
+                results = self.timedSearch(
+                    ldap.dn.dn2str(base),
+                    scope,
+                    filterstr=filterstr,
+                    attrlist=self.attrlist,
</ins><span class="cx">                     timeoutSeconds=timeoutSeconds,
</span><del>-                    resultLimit=limitResults)
</del><ins>+                    resultLimit=limitResults
+                )
</ins><span class="cx">                 numMissingGuids = 0
</span><span class="cx">                 numMissingRecordNames = 0
</span><span class="cx">                 numNotEnabled = 0
</span><span class="lines">@@ -1149,8 +1219,10 @@
</span><span class="cx">                     dn = normalizeDNstr(dn)
</span><span class="cx">                     # Skip if group restriction is in place and guid is not
</span><span class="cx">                     # a member
</span><del>-                    if (recordType != self.recordType_groups and
-                        not self.isAllowedByRestrictToGroup(dn, attrs)):
</del><ins>+                    if (
+                            recordType != self.recordType_groups and
+                            not self.isAllowedByRestrictToGroup(dn, attrs)
+                    ):
</ins><span class="cx">                         continue
</span><span class="cx"> 
</span><span class="cx">                     try:
</span><span class="lines">@@ -1219,19 +1291,27 @@
</span><span class="cx"> 
</span><span class="cx">             else:
</span><span class="cx">                 scope = ldap.SCOPE_SUBTREE
</span><del>-                filterstr = buildFilter(recordType,
</del><ins>+                filterstr = buildFilter(
+                    recordType,
</ins><span class="cx">                     self.rdnSchema[recordType][&quot;mapping&quot;],
</span><del>-                    fields, operand=operand,
-                    optimizeMultiName=self.optimizeMultiName)
</del><ins>+                    fields,
+                    operand=operand,
+                    optimizeMultiName=self.optimizeMultiName
+                )
</ins><span class="cx"> 
</span><span class="cx">             if filterstr is not None:
</span><span class="cx">                 # Query the LDAP server
</span><span class="cx">                 self.log.debug(&quot;LDAP search %s %s %s&quot; %
</span><del>-                    (ldap.dn.dn2str(base), scope, filterstr))
-                results = (yield deferToThread(self.timedSearch, ldap.dn.dn2str(base), scope,
-                    filterstr=filterstr, attrlist=self.attrlist,
</del><ins>+                               (ldap.dn.dn2str(base), scope, filterstr))
+                results = (yield deferToThread(
+                    self.timedSearch,
+                    ldap.dn.dn2str(base),
+                    scope,
+                    filterstr=filterstr,
+                    attrlist=self.attrlist,
</ins><span class="cx">                     timeoutSeconds=self.requestTimeoutSeconds,
</span><del>-                    resultLimit=self.requestResultsLimit))
</del><ins>+                    resultLimit=self.requestResultsLimit)
+                )
</ins><span class="cx">                 self.log.debug(&quot;LDAP search returned %d results&quot; % (len(results),))
</span><span class="cx">                 numMissingGuids = 0
</span><span class="cx">                 numMissingRecordNames = 0
</span><span class="lines">@@ -1239,8 +1319,10 @@
</span><span class="cx">                     dn = normalizeDNstr(dn)
</span><span class="cx">                     # Skip if group restriction is in place and guid is not
</span><span class="cx">                     # a member
</span><del>-                    if (recordType != self.recordType_groups and
-                        not self.isAllowedByRestrictToGroup(dn, attrs)):
</del><ins>+                    if (
+                        recordType != self.recordType_groups and
+                        not self.isAllowedByRestrictToGroup(dn, attrs)
+                    ):
</ins><span class="cx">                         continue
</span><span class="cx"> 
</span><span class="cx">                     try:
</span><span class="lines">@@ -1262,11 +1344,11 @@
</span><span class="cx"> 
</span><span class="cx">                 if numMissingGuids:
</span><span class="cx">                     self.log.warn(&quot;%d %s records are missing %s&quot; %
</span><del>-                        (numMissingGuids, recordType, guidAttr))
</del><ins>+                                  (numMissingGuids, recordType, guidAttr))
</ins><span class="cx"> 
</span><span class="cx">                 if numMissingRecordNames:
</span><span class="cx">                     self.log.warn(&quot;%d %s records are missing record name&quot; %
</span><del>-                        (numMissingRecordNames, recordType))
</del><ins>+                                  (numMissingRecordNames, recordType))
</ins><span class="cx"> 
</span><span class="cx">         self.log.debug(&quot;Principal property search matched %d records&quot; % (len(records),))
</span><span class="cx">         returnValue(records)
</span><span class="lines">@@ -1300,16 +1382,24 @@
</span><span class="cx">                 # recordsMatchingFields for *each* DN.
</span><span class="cx">                 for value in valuesToFetch:
</span><span class="cx">                     fields = [[&quot;dn&quot;, value, False, &quot;equals&quot;]]
</span><del>-                    result = (yield self.recordsMatchingFields(fields,
-                        recordType=self.recordType_groups))
</del><ins>+                    result = (
+                        yield self.recordsMatchingFields(
+                            fields,
+                            recordType=self.recordType_groups
+                        )
+                    )
</ins><span class="cx">                     results.extend(result)
</span><span class="cx">             else:
</span><span class="cx">                 for batch in splitIntoBatches(valuesToFetch, self.batchSize):
</span><span class="cx">                     fields = []
</span><span class="cx">                     for value in batch:
</span><span class="cx">                         fields.append([attributeToSearch, value, False, &quot;equals&quot;])
</span><del>-                    result = (yield self.recordsMatchingFields(fields,
-                        recordType=self.recordType_groups))
</del><ins>+                    result = (
+                        yield self.recordsMatchingFields(
+                            fields,
+                            recordType=self.recordType_groups
+                        )
+                    )
</ins><span class="cx">                     results.extend(result)
</span><span class="cx"> 
</span><span class="cx">             # Reset values for next iteration
</span><span class="lines">@@ -1329,7 +1419,7 @@
</span><span class="cx">                         # cut:  we know we only need to examine groups, and
</span><span class="cx">                         # those will be children of the groups DN
</span><span class="cx">                         if not dnContainedIn(ldap.dn.str2dn(memberAlias),
</span><del>-                            groupsDN):
</del><ins>+                                             groupsDN):
</ins><span class="cx">                             continue
</span><span class="cx">                     if memberAlias not in recordsByAlias:
</span><span class="cx">                         valuesToFetch.add(memberAlias)
</span><span class="lines">@@ -1351,7 +1441,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         dn = ldap.dn.str2dn(dnStr.lower())
</span><span class="cx">         for recordType in self.recordTypes():
</span><del>-            base = self.typeDNs[recordType] # already lowercase
</del><ins>+            base = self.typeDNs[recordType]  # already lowercase
</ins><span class="cx">             if dnContainedIn(dn, base):
</span><span class="cx">                 return recordType
</span><span class="cx">         return None
</span><span class="lines">@@ -1431,7 +1521,8 @@
</span><span class="cx">                             if firstName != lastName:
</span><span class="cx">                                 firstValue = _convertValue(firstName, firstMatchType)
</span><span class="cx">                                 lastValue = _convertValue(lastName, lastMatchType)
</span><del>-                                converted.append(&quot;(&amp;(%s=%s)(%s=%s))&quot; %
</del><ins>+                                converted.append(
+                                    &quot;(&amp;(%s=%s)(%s=%s))&quot; %
</ins><span class="cx">                                     (mapping[&quot;firstName&quot;], firstValue,
</span><span class="cx">                                      mapping[&quot;lastName&quot;], lastValue)
</span><span class="cx">                                 )
</span><span class="lines">@@ -1477,9 +1568,25 @@
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">     filterStr = None
</span><del>-    tokens = [ldapEsc(t) for t in tokens if len(t) &gt; 2]
</del><ins>+
+    # Eliminate any substring duplicates
+    tokenSet = set()
+    for token in tokens:
+        collision = False
+        for existing in tokenSet:
+            if token in existing:
+                collision = True
+                break
+            elif existing in token:
+                tokenSet.remove(existing)
+                break
+        if not collision:
+            tokenSet.add(token)
+
+    tokens = [ldapEsc(t) for t in tokenSet]
</ins><span class="cx">     if len(tokens) == 0:
</span><span class="cx">         return None
</span><ins>+    tokens.sort()
</ins><span class="cx"> 
</span><span class="cx">     attributes = [
</span><span class="cx">         (&quot;fullName&quot;, &quot;(%s=*%s*)&quot;),
</span><span class="lines">@@ -1559,8 +1666,10 @@
</span><span class="cx">         # Identifier of this record as a group member
</span><span class="cx">         memberIdAttr = self.service.groupSchema[&quot;memberIdAttr&quot;]
</span><span class="cx">         if memberIdAttr:
</span><del>-            self._memberId = self.service._getUniqueLdapAttribute(attrs,
-                memberIdAttr)
</del><ins>+            self._memberId = self.service._getUniqueLdapAttribute(
+                attrs,
+                memberIdAttr
+            )
</ins><span class="cx">         else:
</span><span class="cx">             self._memberId = normalizeDNstr(self.dn)
</span><span class="cx"> 
</span><span class="lines">@@ -1588,18 +1697,23 @@
</span><span class="cx">                 base = self.service.base
</span><span class="cx">                 filterstr = &quot;(%s=%s)&quot; % (memberIdAttr, ldapEsc(memberId))
</span><span class="cx">                 self.log.debug(&quot;Retrieving subtree of %s with filter %s&quot; %
</span><del>-                    (ldap.dn.dn2str(base), filterstr),
-                    system=&quot;LdapDirectoryService&quot;)
-                result = self.service.timedSearch(ldap.dn.dn2str(base),
-                    ldap.SCOPE_SUBTREE, filterstr=filterstr,
-                    attrlist=self.service.attrlist)
</del><ins>+                               (ldap.dn.dn2str(base), filterstr),
+                               system=&quot;LdapDirectoryService&quot;)
+                result = self.service.timedSearch(
+                    ldap.dn.dn2str(base),
+                    ldap.SCOPE_SUBTREE,
+                    filterstr=filterstr,
+                    attrlist=self.service.attrlist
+                )
</ins><span class="cx"> 
</span><del>-            else: # using DN
</del><ins>+            else:  # using DN
</ins><span class="cx"> 
</span><span class="cx">                 self.log.debug(&quot;Retrieving %s.&quot; % memberId,
</span><del>-                    system=&quot;LdapDirectoryService&quot;)
-                result = self.service.timedSearch(memberId,
-                    ldap.SCOPE_BASE, attrlist=self.service.attrlist)
</del><ins>+                               system=&quot;LdapDirectoryService&quot;)
+                result = self.service.timedSearch(
+                    memberId,
+                    ldap.SCOPE_BASE, attrlist=self.service.attrlist
+                )
</ins><span class="cx"> 
</span><span class="cx">             if result:
</span><span class="cx"> 
</span><span class="lines">@@ -1611,12 +1725,16 @@
</span><span class="cx">                     self.log.error(&quot;Unable to map %s to a record type&quot; % (dn,))
</span><span class="cx">                     continue
</span><span class="cx"> 
</span><del>-                shortName = self.service._getUniqueLdapAttribute(attrs,
-                    self.service.rdnSchema[recordType][&quot;mapping&quot;][&quot;recordName&quot;])
</del><ins>+                shortName = self.service._getUniqueLdapAttribute(
+                    attrs,
+                    self.service.rdnSchema[recordType][&quot;mapping&quot;][&quot;recordName&quot;]
+                )
</ins><span class="cx"> 
</span><span class="cx">                 if shortName:
</span><del>-                    record = self.service.recordWithShortName(recordType,
-                        shortName)
</del><ins>+                    record = self.service.recordWithShortName(
+                        recordType,
+                        shortName
+                    )
</ins><span class="cx">                     if record:
</span><span class="cx">                         results.append(record)
</span><span class="cx"> 
</span><span class="lines">@@ -1647,7 +1765,8 @@
</span><span class="cx">         if len(membersAttrs) == 1:
</span><span class="cx">             filterstr = &quot;(%s=%s)&quot; % (membersAttrs[0], self._memberId)
</span><span class="cx">         else:
</span><del>-            filterstr = &quot;(|%s)&quot; % (&quot;&quot;.join(
</del><ins>+            filterstr = &quot;(|%s)&quot; % (
+                &quot;&quot;.join(
</ins><span class="cx">                     [&quot;(%s=%s)&quot; % (a, self._memberId) for a in membersAttrs]
</span><span class="cx">                 ),
</span><span class="cx">             )
</span><span class="lines">@@ -1655,8 +1774,12 @@
</span><span class="cx">         groups = []
</span><span class="cx"> 
</span><span class="cx">         try:
</span><del>-            results = self.service.timedSearch(ldap.dn.dn2str(base),
-                ldap.SCOPE_SUBTREE, filterstr=filterstr, attrlist=self.service.attrlist)
</del><ins>+            results = self.service.timedSearch(
+                ldap.dn.dn2str(base),
+                ldap.SCOPE_SUBTREE,
+                filterstr=filterstr,
+                attrlist=self.service.attrlist
+            )
</ins><span class="cx"> 
</span><span class="cx">             for dn, attrs in results:
</span><span class="cx">                 dn = normalizeDNstr(dn)
</span><span class="lines">@@ -1737,12 +1860,13 @@
</span><span class="cx"> 
</span><span class="cx">                 except ldap.INVALID_CREDENTIALS:
</span><span class="cx">                     self.log.info(&quot;Invalid credentials for {dn}&quot;,
</span><del>-                        dn=repr(self.dn), system=&quot;LdapDirectoryService&quot;)
</del><ins>+                                  dn=repr(self.dn),
+                                  system=&quot;LdapDirectoryService&quot;)
</ins><span class="cx">                     return False
</span><span class="cx"> 
</span><span class="cx">             else:
</span><span class="cx">                 self.log.error(&quot;Unknown Authentication Method '{method}'&quot;,
</span><del>-                    method=self.service.authMethod.upper())
</del><ins>+                               method=self.service.authMethod.upper())
</ins><span class="cx">                 raise DirectoryConfigurationError()
</span><span class="cx"> 
</span><span class="cx">         return super(LdapDirectoryRecord, self).verifyCredentials(credentials)
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryopendirectorybackerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/opendirectorybacker.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/opendirectorybacker.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/opendirectorybacker.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -23,46 +23,46 @@
</span><span class="cx">     &quot;OpenDirectoryBackingService&quot;, &quot;VCardRecord&quot;,
</span><span class="cx"> ]
</span><span class="cx"> 
</span><del>-import traceback
-import hashlib
</del><ins>+from calendarserver.platform.darwin.od import opendirectory, dsattributes, dsquery
</ins><span class="cx"> 
</span><del>-import os
-import sys
-import time
-
-from os import listdir
-from os.path import join, abspath
-from tempfile import mkstemp, gettempdir
-from random import random
-
</del><ins>+from pycalendar.datetime import DateTime
+from pycalendar.vcard.adr import Adr
</ins><span class="cx"> from pycalendar.vcard.n import N
</span><del>-from pycalendar.vcard.adr import Adr
-from pycalendar.datetime import DateTime
</del><span class="cx"> 
</span><del>-from socket import getfqdn
</del><span class="cx"> 
</span><del>-from twisted.internet import reactor
-from twisted.internet.defer import inlineCallbacks, returnValue, deferredGenerator, succeed
</del><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><del>-from txdav.xml import element as davxml
-from txdav.xml.base import twisted_dav_namespace, dav_namespace, parse_date, twisted_private_namespace
</del><ins>+
</ins><span class="cx"> from txweb2.dav.resource import DAVPropertyMixIn
</span><span class="cx"> from txweb2.dav.util import joinURL
</span><span class="cx"> from txweb2.http_headers import MimeType, generateContentType, ETag
</span><span class="cx"> 
</span><ins>+from twisted.internet import reactor
+from twisted.internet.defer import inlineCallbacks, returnValue, deferredGenerator, succeed
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import customxml, carddavxml
</span><ins>+from twistedcaldav.config import config
</ins><span class="cx"> from twistedcaldav.customxml import calendarserver_namespace
</span><del>-from twistedcaldav.config import config
</del><span class="cx"> from twistedcaldav.directory.directory import DirectoryService, DirectoryRecord
</span><span class="cx"> from twistedcaldav.memcachelock import MemcacheLock, MemcacheLockTimeoutError
</span><del>-from twistedcaldav.query import addressbookqueryfilter
</del><span class="cx"> from twistedcaldav.vcard import Component, Property, vCardProductID
</span><span class="cx"> 
</span><ins>+from txdav.carddav.datastore.query.filter import IsNotDefined, ParameterFilter, \
+    TextMatch
+from txdav.xml import element as davxml
+from txdav.xml.base import twisted_dav_namespace, dav_namespace, parse_date, twisted_private_namespace
+
+from os import listdir
+from os.path import join, abspath
+from random import random
+from socket import getfqdn
+from tempfile import mkstemp, gettempdir
</ins><span class="cx"> from xmlrpclib import datetime
</span><ins>+import hashlib
+import os
+import sys
+import time
+import traceback
</ins><span class="cx"> 
</span><del>-from calendarserver.platform.darwin.od import opendirectory, dsattributes, dsquery
-
</del><span class="cx"> class OpenDirectoryBackingService(DirectoryService):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Open Directory implementation of L{IDirectoryService}.
</span><span class="lines">@@ -830,11 +830,11 @@
</span><span class="cx">                 if not constant and not allAttrStrings:
</span><span class="cx">                     return (False, [], [])
</span><span class="cx"> 
</span><del>-                if propFilter.qualifier and isinstance(propFilter.qualifier, addressbookqueryfilter.IsNotDefined):
</del><ins>+                if propFilter.qualifier and isinstance(propFilter.qualifier, IsNotDefined):
</ins><span class="cx">                     return definedExpression(False, filterAllOf, propFilter.filter_name, constant, queryAttributes, allAttrStrings)
</span><span class="cx"> 
</span><del>-                paramFilterElements = [paramFilterElement for paramFilterElement in propFilter.filters if isinstance(paramFilterElement, addressbookqueryfilter.ParameterFilter)]
-                textMatchElements = [textMatchElement for textMatchElement in propFilter.filters if isinstance(textMatchElement, addressbookqueryfilter.TextMatch)]
</del><ins>+                paramFilterElements = [paramFilterElement for paramFilterElement in propFilter.filters if isinstance(paramFilterElement, ParameterFilter)]
+                textMatchElements = [textMatchElement for textMatchElement in propFilter.filters if isinstance(textMatchElement, TextMatch)]
</ins><span class="cx">                 propFilterAllOf = propFilter.propfilter_test == &quot;allof&quot;
</span><span class="cx"> 
</span><span class="cx">                 # handle parameter filter elements
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryprincipalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/principal.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/principal.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/principal.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.directory.test.test_principal -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -922,6 +922,23 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><ins>+    def proxyMode(self, principal):
+        &quot;&quot;&quot;
+        Determine whether what proxy mode this principal has in relation to the one specified.
+        &quot;&quot;&quot;
+
+        read_uids = (yield self.proxyFor(False))
+        if principal in read_uids:
+            returnValue(&quot;read&quot;)
+
+        write_uids = (yield self.proxyFor(True))
+        if principal in write_uids:
+            returnValue(&quot;write&quot;)
+
+        returnValue(&quot;none&quot;)
+
+
+    @inlineCallbacks
</ins><span class="cx">     def proxyFor(self, read_write, resolve_memberships=True):
</span><span class="cx"> 
</span><span class="cx">         proxyFors = set()
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/resource.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/resource.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/resource.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -22,6 +22,8 @@
</span><span class="cx"> 
</span><span class="cx"> from twistedcaldav.client.reverseproxy import ReverseProxyResource
</span><span class="cx"> 
</span><ins>+from twisted.internet.defer import succeed
+
</ins><span class="cx"> __all__ = [&quot;DirectoryReverseProxyResource&quot;]
</span><span class="cx"> 
</span><span class="cx"> class DirectoryReverseProxyResource(ReverseProxyResource):
</span><span class="lines">@@ -35,3 +37,32 @@
</span><span class="cx"> 
</span><span class="cx">     def url(self):
</span><span class="cx">         return joinURL(self.parent.url(), self.record.uid)
</span><ins>+
+
+    def hasQuota(self, request):
+        return succeed(False)
+
+
+    def hasQuotaRoot(self, request):
+        return succeed(False)
+
+
+    def quotaRootResource(self, request):
+        &quot;&quot;&quot;
+        Return the quota root for this resource.
+
+        @return: L{DAVResource} or C{None}
+        &quot;&quot;&quot;
+
+        return succeed(None)
+
+
+    def checkPrivileges(
+        self, request, privileges, recurse=False,
+        principal=None, inherited_aces=None
+    ):
+        return succeed(None)
+
+
+    def hasProperty(self, property, request):
+        return succeed(False)
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryresourceinfopy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/resourceinfo.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/resourceinfo.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/resourceinfo.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestaccountsmodifiedxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/accounts-modified.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/accounts-modified.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/accounts-modified.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestaccountsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/accounts.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/accounts.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/accounts.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span><span class="lines">@@ -139,7 +139,7 @@
</span><span class="cx">       &lt;member type=&quot;users&quot;&gt;delegateviagroup&lt;/member&gt;
</span><span class="cx">     &lt;/members&gt;
</span><span class="cx">   &lt;/group&gt;
</span><del>-  &lt;user repeat=&quot;2&quot;&gt;
</del><ins>+  &lt;user repeat=&quot;100&quot;&gt;
</ins><span class="cx">     &lt;uid&gt;user%02d&lt;/uid&gt;
</span><span class="cx">     &lt;guid&gt;user%02d&lt;/guid&gt;
</span><span class="cx">     &lt;password&gt;%02duser&lt;/password&gt;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestaugmentsnormalizationxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/augments-normalization.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/augments-normalization.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/augments-normalization.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestaugmentstestdefaultxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/augments-test-default.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/augments-test-default.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/augments-test-default.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestaugmentstestxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/augments-test.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/augments-test.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/augments-test.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestaugmentsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/augments.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/augments.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/augments.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span><span class="lines">@@ -57,7 +57,7 @@
</span><span class="cx">     &lt;enable-calendar&gt;false&lt;/enable-calendar&gt;
</span><span class="cx">     &lt;enable-addressbook&gt;false&lt;/enable-addressbook&gt;
</span><span class="cx">   &lt;/record&gt;
</span><del>-  &lt;record repeat=&quot;2&quot;&gt;
</del><ins>+  &lt;record repeat=&quot;100&quot;&gt;
</ins><span class="cx">     &lt;uid&gt;user%02d&lt;/uid&gt;
</span><span class="cx">     &lt;enable&gt;true&lt;/enable&gt;
</span><span class="cx">     &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestmodifyaugmentsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/modify/augments.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/modify/augments.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/modify/augments.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestmodifyresourceslocationsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/modify/resources-locations.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/modify/resources-locations.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/modify/resources-locations.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestmodifyusersgroupsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/modify/users-groups.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/modify/users-groups.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/modify/users-groups.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestproxiesxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/proxies.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/proxies.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/proxies.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestresourcesaugmentsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources/augments.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources/augments.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources/augments.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestresourcescaldavdplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources/caldavd.plist (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources/caldavd.plist        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources/caldavd.plist        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-    Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+    Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx">     Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx">     you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestresourcesresourceslocationsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources/resources-locations.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources/resources-locations.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources/resources-locations.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestresourcesusersgroupsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources/users-groups.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources/users-groups.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources/users-groups.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestresourcesxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/resources.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_aggregatepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_aggregate.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_aggregate.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_aggregate.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_augmentpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_augment.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_augment.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_augment.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_buildquerypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_buildquery.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_buildquery.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_buildquery.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_cachedirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_cachedirectory.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_cachedirectory.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_cachedirectory.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> #
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_calendarpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_calendar.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_calendar.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_calendar.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_digestpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_digest.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_digest.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_digest.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_directorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_directory.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_directory.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_directory.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -999,8 +999,9 @@
</span><span class="cx">         Exercise the default recordsMatchingTokens implementation
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         records = list((yield self.directoryService.recordsMatchingTokens([&quot;Use&quot;, &quot;01&quot;])))
</span><del>-        self.assertEquals(len(records), 1)
-        self.assertEquals(records[0].shortNames[0], &quot;user01&quot;)
</del><ins>+        self.assertNotEquals(len(records), 0)
+        shorts = [record.shortNames[0] for record in records]
+        self.assertTrue(&quot;user01&quot; in shorts)
</ins><span class="cx"> 
</span><span class="cx">         records = list((yield self.directoryService.recordsMatchingTokens(['&quot;quotey&quot;'],
</span><span class="cx">             context=self.directoryService.searchContext_attendee)))
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_guidchangepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_guidchange.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_guidchange.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_guidchange.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_ldapdirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_ldapdirectory.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_ldapdirectory.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_ldapdirectory.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -23,9 +23,13 @@
</span><span class="cx">     )
</span><span class="cx">     from twistedcaldav.directory.util import splitIntoBatches
</span><span class="cx">     from twistedcaldav.test.util import proxiesFile
</span><del>-    from twistedcaldav.directory.calendaruserproxyloader import XMLCalendarUserProxyLoader
</del><ins>+    from twistedcaldav.directory.calendaruserproxyloader import (
+        XMLCalendarUserProxyLoader
+    )
</ins><span class="cx">     from twistedcaldav.directory import calendaruserproxy
</span><del>-    from twistedcaldav.directory.directory import GroupMembershipCache, GroupMembershipCacheUpdater
</del><ins>+    from twistedcaldav.directory.directory import (
+        GroupMembershipCache, GroupMembershipCacheUpdater
+    )
</ins><span class="cx">     from twisted.internet.defer import inlineCallbacks
</span><span class="cx">     from string import maketrans
</span><span class="cx">     import ldap
</span><span class="lines">@@ -38,79 +42,79 @@
</span><span class="cx"> 
</span><span class="cx">         def test_buildFilter(self):
</span><span class="cx">             mapping = {
</span><del>-                &quot;recordName&quot; : &quot;uid&quot;,
-                &quot;fullName&quot; : &quot;cn&quot;,
-                &quot;emailAddresses&quot; : &quot;mail&quot;,
-                &quot;firstName&quot; : &quot;givenName&quot;,
-                &quot;lastName&quot; : &quot;sn&quot;,
-                &quot;guid&quot; : &quot;generateduid&quot;,
-                &quot;memberIDAttr&quot; : &quot;generateduid&quot;,
</del><ins>+                &quot;recordName&quot;: &quot;uid&quot;,
+                &quot;fullName&quot;: &quot;cn&quot;,
+                &quot;emailAddresses&quot;: &quot;mail&quot;,
+                &quot;firstName&quot;: &quot;givenName&quot;,
+                &quot;lastName&quot;: &quot;sn&quot;,
+                &quot;guid&quot;: &quot;generateduid&quot;,
+                &quot;memberIDAttr&quot;: &quot;generateduid&quot;,
</ins><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             entries = [
</span><span class="cx">                 {
</span><del>-                    &quot;fields&quot; : [
</del><ins>+                    &quot;fields&quot;: [
</ins><span class="cx">                         (&quot;fullName&quot;, &quot;mor&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                         (&quot;emailAddresses&quot;, &quot;mor&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                         (&quot;firstName&quot;, &quot;mor&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                         (&quot;lastName&quot;, &quot;mor&quot;, True, u&quot;starts-with&quot;)
</span><span class="cx">                     ],
</span><del>-                    &quot;operand&quot; : &quot;or&quot;,
-                    &quot;recordType&quot; : &quot;users&quot;,
-                    &quot;expected&quot; : &quot;(&amp;(uid=*)(generateduid=*)(|(cn=mor*)(mail=mor*)(givenName=mor*)(sn=mor*)))&quot;,
-                    &quot;optimize&quot; : False,
</del><ins>+                    &quot;operand&quot;: &quot;or&quot;,
+                    &quot;recordType&quot;: &quot;users&quot;,
+                    &quot;expected&quot;: &quot;(&amp;(uid=*)(generateduid=*)(|(cn=mor*)(mail=mor*)(givenName=mor*)(sn=mor*)))&quot;,
+                    &quot;optimize&quot;: False,
</ins><span class="cx">                 },
</span><span class="cx">                 {
</span><del>-                    &quot;fields&quot; : [
</del><ins>+                    &quot;fields&quot;: [
</ins><span class="cx">                         (&quot;fullName&quot;, &quot;mor(&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                         (&quot;emailAddresses&quot;, &quot;mor)&quot;, True, u&quot;contains&quot;),
</span><span class="cx">                         (&quot;firstName&quot;, &quot;mor*&quot;, True, u&quot;exact&quot;),
</span><span class="cx">                         (&quot;lastName&quot;, &quot;mor\\&quot;, True, u&quot;starts-with&quot;)
</span><span class="cx">                     ],
</span><del>-                    &quot;operand&quot; : &quot;or&quot;,
-                    &quot;recordType&quot; : &quot;users&quot;,
-                    &quot;expected&quot; : &quot;(&amp;(uid=*)(generateduid=*)(|(cn=mor\\28*)(mail=*mor\\29*)(givenName=mor\\2a)(sn=mor\\5c*)))&quot;,
-                    &quot;optimize&quot; : False,
</del><ins>+                    &quot;operand&quot;: &quot;or&quot;,
+                    &quot;recordType&quot;: &quot;users&quot;,
+                    &quot;expected&quot;: &quot;(&amp;(uid=*)(generateduid=*)(|(cn=mor\\28*)(mail=*mor\\29*)(givenName=mor\\2a)(sn=mor\\5c*)))&quot;,
+                    &quot;optimize&quot;: False,
</ins><span class="cx">                 },
</span><span class="cx">                 {
</span><del>-                    &quot;fields&quot; : [
</del><ins>+                    &quot;fields&quot;: [
</ins><span class="cx">                         (&quot;fullName&quot;, &quot;mor&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                     ],
</span><del>-                    &quot;operand&quot; : &quot;or&quot;,
-                    &quot;recordType&quot; : &quot;users&quot;,
-                    &quot;expected&quot; : &quot;(&amp;(uid=*)(generateduid=*)(cn=mor*))&quot;,
-                    &quot;optimize&quot; : False,
</del><ins>+                    &quot;operand&quot;: &quot;or&quot;,
+                    &quot;recordType&quot;: &quot;users&quot;,
+                    &quot;expected&quot;: &quot;(&amp;(uid=*)(generateduid=*)(cn=mor*))&quot;,
+                    &quot;optimize&quot;: False,
</ins><span class="cx">                 },
</span><span class="cx">                 {
</span><del>-                    &quot;fields&quot; : [
</del><ins>+                    &quot;fields&quot;: [
</ins><span class="cx">                         (&quot;fullName&quot;, &quot;mor&quot;, True, u&quot;contains&quot;),
</span><span class="cx">                         (&quot;emailAddresses&quot;, &quot;mor&quot;, True, u&quot;equals&quot;),
</span><span class="cx">                         (&quot;invalid&quot;, &quot;mor&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                     ],
</span><del>-                    &quot;operand&quot; : &quot;and&quot;,
-                    &quot;recordType&quot; : &quot;users&quot;,
-                    &quot;expected&quot; : &quot;(&amp;(uid=*)(generateduid=*)(&amp;(cn=*mor*)(mail=mor)))&quot;,
-                    &quot;optimize&quot; : False,
</del><ins>+                    &quot;operand&quot;: &quot;and&quot;,
+                    &quot;recordType&quot;: &quot;users&quot;,
+                    &quot;expected&quot;: &quot;(&amp;(uid=*)(generateduid=*)(&amp;(cn=*mor*)(mail=mor)))&quot;,
+                    &quot;optimize&quot;: False,
</ins><span class="cx">                 },
</span><span class="cx">                 {
</span><del>-                    &quot;fields&quot; : [
</del><ins>+                    &quot;fields&quot;: [
</ins><span class="cx">                         (&quot;invalid&quot;, &quot;mor&quot;, True, u&quot;contains&quot;),
</span><span class="cx">                         (&quot;invalid&quot;, &quot;mor&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                     ],
</span><del>-                    &quot;operand&quot; : &quot;and&quot;,
-                    &quot;recordType&quot; : &quot;users&quot;,
-                    &quot;expected&quot; : None,
-                    &quot;optimize&quot; : False,
</del><ins>+                    &quot;operand&quot;: &quot;and&quot;,
+                    &quot;recordType&quot;: &quot;users&quot;,
+                    &quot;expected&quot;: None,
+                    &quot;optimize&quot;: False,
</ins><span class="cx">                 },
</span><span class="cx">                 {
</span><del>-                    &quot;fields&quot; : [ ],
-                    &quot;operand&quot; : &quot;and&quot;,
-                    &quot;recordType&quot; : &quot;users&quot;,
-                    &quot;expected&quot; : None,
-                    &quot;optimize&quot; : False,
</del><ins>+                    &quot;fields&quot;: [],
+                    &quot;operand&quot;: &quot;and&quot;,
+                    &quot;recordType&quot;: &quot;users&quot;,
+                    &quot;expected&quot;: None,
+                    &quot;optimize&quot;: False,
</ins><span class="cx">                 },
</span><span class="cx">                 {
</span><del>-                    &quot;fields&quot; : [
</del><ins>+                    &quot;fields&quot;: [
</ins><span class="cx">                         (&quot;fullName&quot;, &quot;mor&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                         (&quot;fullName&quot;, &quot;sag&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                         (&quot;emailAddresses&quot;, &quot;mor&quot;, True, u&quot;starts-with&quot;),
</span><span class="lines">@@ -120,13 +124,13 @@
</span><span class="cx">                         (&quot;lastName&quot;, &quot;mor&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                         (&quot;lastName&quot;, &quot;sag&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                     ],
</span><del>-                    &quot;operand&quot; : &quot;or&quot;,
-                    &quot;recordType&quot; : &quot;users&quot;,
-                    &quot;expected&quot; : &quot;(&amp;(uid=*)(generateduid=*)(|(&amp;(givenName=mor*)(sn=sag*))(&amp;(givenName=sag*)(sn=mor*))))&quot;,
-                    &quot;optimize&quot; : True,
</del><ins>+                    &quot;operand&quot;: &quot;or&quot;,
+                    &quot;recordType&quot;: &quot;users&quot;,
+                    &quot;expected&quot;: &quot;(&amp;(uid=*)(generateduid=*)(|(&amp;(givenName=mor*)(sn=sag*))(&amp;(givenName=sag*)(sn=mor*))))&quot;,
+                    &quot;optimize&quot;: True,
</ins><span class="cx">                 },
</span><span class="cx">                 {
</span><del>-                    &quot;fields&quot; : [
</del><ins>+                    &quot;fields&quot;: [
</ins><span class="cx">                         (&quot;fullName&quot;, &quot;mor&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                         (&quot;fullName&quot;, &quot;sag&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                         (&quot;emailAddresses&quot;, &quot;mor&quot;, True, u&quot;starts-with&quot;),
</span><span class="lines">@@ -136,13 +140,13 @@
</span><span class="cx">                         (&quot;lastName&quot;, &quot;mor&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                         (&quot;lastName&quot;, &quot;sag&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                     ],
</span><del>-                    &quot;operand&quot; : &quot;or&quot;,
-                    &quot;recordType&quot; : &quot;groups&quot;,
-                    &quot;expected&quot; : None,
-                    &quot;optimize&quot; : True,
</del><ins>+                    &quot;operand&quot;: &quot;or&quot;,
+                    &quot;recordType&quot;: &quot;groups&quot;,
+                    &quot;expected&quot;: None,
+                    &quot;optimize&quot;: True,
</ins><span class="cx">                 },
</span><span class="cx">                 {
</span><del>-                    &quot;fields&quot; : [
</del><ins>+                    &quot;fields&quot;: [
</ins><span class="cx">                         (&quot;fullName&quot;, &quot;mor&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                         (&quot;fullName&quot;, &quot;sag&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                         (&quot;emailAddresses&quot;, &quot;mor&quot;, True, u&quot;starts-with&quot;),
</span><span class="lines">@@ -152,123 +156,142 @@
</span><span class="cx">                         (&quot;lastName&quot;, &quot;mor&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                         (&quot;lastName&quot;, &quot;sag&quot;, True, u&quot;starts-with&quot;),
</span><span class="cx">                     ],
</span><del>-                    &quot;operand&quot; : &quot;or&quot;,
-                    &quot;recordType&quot; : &quot;groups&quot;,
-                    &quot;expected&quot; : None,
-                    &quot;optimize&quot; : True,
</del><ins>+                    &quot;operand&quot;: &quot;or&quot;,
+                    &quot;recordType&quot;: &quot;groups&quot;,
+                    &quot;expected&quot;: None,
+                    &quot;optimize&quot;: True,
</ins><span class="cx">                 },
</span><span class="cx">                 {
</span><del>-                    &quot;fields&quot; : [
</del><ins>+                    &quot;fields&quot;: [
</ins><span class="cx">                         (&quot;guid&quot;, &quot;xyzzy&quot;, True, u&quot;equals&quot;),
</span><span class="cx">                         (&quot;guid&quot;, &quot;plugh&quot;, True, u&quot;equals&quot;),
</span><span class="cx">                     ],
</span><del>-                    &quot;operand&quot; : &quot;or&quot;,
-                    &quot;recordType&quot; : &quot;groups&quot;,
-                    &quot;expected&quot; : &quot;(&amp;(uid=*)(generateduid=*)(|(generateduid=xyzzy)(generateduid=plugh)))&quot;,
-                    &quot;optimize&quot; : True,
</del><ins>+                    &quot;operand&quot;: &quot;or&quot;,
+                    &quot;recordType&quot;: &quot;groups&quot;,
+                    &quot;expected&quot;: &quot;(&amp;(uid=*)(generateduid=*)(|(generateduid=xyzzy)(generateduid=plugh)))&quot;,
+                    &quot;optimize&quot;: True,
</ins><span class="cx">                 },
</span><span class="cx">                 {
</span><del>-                    &quot;fields&quot; : [
</del><ins>+                    &quot;fields&quot;: [
</ins><span class="cx">                         (&quot;fullName&quot;, &quot;mor&quot;, True, u&quot;contains&quot;),
</span><span class="cx">                         (&quot;fullName&quot;, &quot;sag&quot;, True, u&quot;contains&quot;),
</span><span class="cx">                     ],
</span><del>-                    &quot;operand&quot; : &quot;or&quot;,
-                    &quot;recordType&quot; : &quot;locations&quot;,
-                    &quot;expected&quot; : &quot;(&amp;(uid=*)(generateduid=*)(|(cn=*mor*)(cn=*sag*)))&quot;,
-                    &quot;optimize&quot; : True,
</del><ins>+                    &quot;operand&quot;: &quot;or&quot;,
+                    &quot;recordType&quot;: &quot;locations&quot;,
+                    &quot;expected&quot;: &quot;(&amp;(uid=*)(generateduid=*)(|(cn=*mor*)(cn=*sag*)))&quot;,
+                    &quot;optimize&quot;: True,
</ins><span class="cx">                 },
</span><span class="cx">                 {
</span><del>-                    &quot;fields&quot; : [
</del><ins>+                    &quot;fields&quot;: [
</ins><span class="cx">                         (&quot;fullName&quot;, &quot;mor&quot;, True, u&quot;contains&quot;),
</span><span class="cx">                         (&quot;fullName&quot;, &quot;sag&quot;, True, u&quot;contains&quot;),
</span><span class="cx">                     ],
</span><del>-                    &quot;operand&quot; : &quot;or&quot;,
-                    &quot;recordType&quot; : &quot;resources&quot;,
-                    &quot;expected&quot; : &quot;(&amp;(uid=*)(generateduid=*)(|(cn=*mor*)(cn=*sag*)))&quot;,
-                    &quot;optimize&quot; : True,
</del><ins>+                    &quot;operand&quot;: &quot;or&quot;,
+                    &quot;recordType&quot;: &quot;resources&quot;,
+                    &quot;expected&quot;: &quot;(&amp;(uid=*)(generateduid=*)(|(cn=*mor*)(cn=*sag*)))&quot;,
+                    &quot;optimize&quot;: True,
</ins><span class="cx">                 },
</span><span class="cx">             ]
</span><span class="cx">             for entry in entries:
</span><span class="cx">                 self.assertEquals(
</span><span class="cx">                     buildFilter(entry[&quot;recordType&quot;], mapping, entry[&quot;fields&quot;],
</span><del>-                        operand=entry[&quot;operand&quot;], optimizeMultiName=entry[&quot;optimize&quot;]),
</del><ins>+                                operand=entry[&quot;operand&quot;], optimizeMultiName=entry[&quot;optimize&quot;]),
</ins><span class="cx">                     entry[&quot;expected&quot;]
</span><span class="cx">                 )
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     class BuildFilterFromTokensTestCase(TestCase):
</span><span class="cx"> 
</span><span class="cx">         def test_buildFilterFromTokens(self):
</span><span class="cx"> 
</span><span class="cx">             entries = [
</span><span class="cx">                 {
</span><del>-                    &quot;tokens&quot; : [&quot;foo&quot;],
-                    &quot;mapping&quot; : {
-                        &quot;fullName&quot; : &quot;cn&quot;,
-                        &quot;emailAddresses&quot; : &quot;mail&quot;,
</del><ins>+                    &quot;tokens&quot;: [&quot;foo&quot;],
+                    &quot;mapping&quot;: {
+                        &quot;fullName&quot;: &quot;cn&quot;,
+                        &quot;emailAddresses&quot;: &quot;mail&quot;,
</ins><span class="cx">                     },
</span><del>-                    &quot;expected&quot; : &quot;(&amp;(a=b)(|(cn=*foo*)(mail=foo*)))&quot;,
-                    &quot;extra&quot; : &quot;(a=b)&quot;,
</del><ins>+                    &quot;expected&quot;: &quot;(&amp;(a=b)(|(cn=*foo*)(mail=foo*)))&quot;,
+                    &quot;extra&quot;: &quot;(a=b)&quot;,
</ins><span class="cx">                 },
</span><span class="cx">                 {
</span><del>-                    &quot;tokens&quot; : [&quot;foo&quot;],
-                    &quot;mapping&quot; : {
-                        &quot;fullName&quot; : &quot;cn&quot;,
-                        &quot;emailAddresses&quot; : [&quot;mail&quot;, &quot;mailAliases&quot;],
</del><ins>+                    &quot;tokens&quot;: [&quot;foo&quot;, &quot;foo&quot;, &quot;oo&quot;, &quot;fo&quot;, &quot;bar&quot;],
+                    &quot;mapping&quot;: {
+                        &quot;fullName&quot;: &quot;cn&quot;,
+                        &quot;emailAddresses&quot;: &quot;mail&quot;,
</ins><span class="cx">                     },
</span><del>-                    &quot;expected&quot; : &quot;(&amp;(a=b)(|(cn=*foo*)(mail=foo*)(mailAliases=foo*)))&quot;,
-                    &quot;extra&quot; : &quot;(a=b)&quot;,
</del><ins>+                    &quot;expected&quot;: &quot;(&amp;(a=b)(|(cn=*bar*)(mail=bar*))(|(cn=*foo*)(mail=foo*)))&quot;,
+                    &quot;extra&quot;: &quot;(a=b)&quot;,
</ins><span class="cx">                 },
</span><span class="cx">                 {
</span><del>-                    &quot;tokens&quot; : [],
-                    &quot;mapping&quot; : {
-                        &quot;fullName&quot; : &quot;cn&quot;,
-                        &quot;emailAddresses&quot; : &quot;mail&quot;,
</del><ins>+                    &quot;tokens&quot;: [&quot;fo&quot;, &quot;foo&quot;, &quot;foooo&quot;, &quot;ooo&quot;, &quot;fooo&quot;],
+                    &quot;mapping&quot;: {
+                        &quot;fullName&quot;: &quot;cn&quot;,
+                        &quot;emailAddresses&quot;: &quot;mail&quot;,
</ins><span class="cx">                     },
</span><del>-                    &quot;expected&quot; : None,
-                    &quot;extra&quot; : None,
</del><ins>+                    &quot;expected&quot;: &quot;(&amp;(a=b)(|(cn=*foooo*)(mail=foooo*)))&quot;,
+                    &quot;extra&quot;: &quot;(a=b)&quot;,
</ins><span class="cx">                 },
</span><span class="cx">                 {
</span><del>-                    &quot;tokens&quot; : [&quot;foo&quot;, &quot;bar&quot;],
-                    &quot;mapping&quot; : { },
-                    &quot;expected&quot; : None,
-                    &quot;extra&quot; : None,
</del><ins>+                    &quot;tokens&quot;: [&quot;foo&quot;],
+                    &quot;mapping&quot;: {
+                        &quot;fullName&quot;: &quot;cn&quot;,
+                        &quot;emailAddresses&quot;: [&quot;mail&quot;, &quot;mailAliases&quot;],
+                    },
+                    &quot;expected&quot;: &quot;(&amp;(a=b)(|(cn=*foo*)(mail=foo*)(mailAliases=foo*)))&quot;,
+                    &quot;extra&quot;: &quot;(a=b)&quot;,
</ins><span class="cx">                 },
</span><span class="cx">                 {
</span><del>-                    &quot;tokens&quot; : [&quot;foo&quot;, &quot;bar&quot;],
-                    &quot;mapping&quot; : {
-                        &quot;emailAddresses&quot; : &quot;mail&quot;,
</del><ins>+                    &quot;tokens&quot;: [],
+                    &quot;mapping&quot;: {
+                        &quot;fullName&quot;: &quot;cn&quot;,
+                        &quot;emailAddresses&quot;: &quot;mail&quot;,
</ins><span class="cx">                     },
</span><del>-                    &quot;expected&quot; : &quot;(&amp;(mail=foo*)(mail=bar*))&quot;,
-                    &quot;extra&quot; : None,
</del><ins>+                    &quot;expected&quot;: None,
+                    &quot;extra&quot;: None,
</ins><span class="cx">                 },
</span><span class="cx">                 {
</span><del>-                    &quot;tokens&quot; : [&quot;foo&quot;, &quot;bar&quot;],
-                    &quot;mapping&quot; : {
-                        &quot;fullName&quot; : &quot;cn&quot;,
-                        &quot;emailAddresses&quot; : &quot;mail&quot;,
</del><ins>+                    &quot;tokens&quot;: [&quot;foo&quot;, &quot;bar&quot;],
+                    &quot;mapping&quot;: {},
+                    &quot;expected&quot;: None,
+                    &quot;extra&quot;: None,
+                },
+                {
+                    &quot;tokens&quot;: [&quot;foo&quot;, &quot;bar&quot;],
+                    &quot;mapping&quot;: {
+                        &quot;emailAddresses&quot;: &quot;mail&quot;,
</ins><span class="cx">                     },
</span><del>-                    &quot;expected&quot; : &quot;(&amp;(|(cn=*foo*)(mail=foo*))(|(cn=*bar*)(mail=bar*)))&quot;,
-                    &quot;extra&quot; : None,
</del><ins>+                    &quot;expected&quot;: &quot;(&amp;(mail=bar*)(mail=foo*))&quot;,
+                    &quot;extra&quot;: None,
</ins><span class="cx">                 },
</span><span class="cx">                 {
</span><del>-                    &quot;tokens&quot; : [&quot;foo&quot;, &quot;bar&quot;],
-                    &quot;mapping&quot; : {
-                        &quot;fullName&quot; : &quot;cn&quot;,
-                        &quot;emailAddresses&quot; : [&quot;mail&quot;, &quot;mailAliases&quot;],
</del><ins>+                    &quot;tokens&quot;: [&quot;foo&quot;, &quot;bar&quot;],
+                    &quot;mapping&quot;: {
+                        &quot;fullName&quot;: &quot;cn&quot;,
+                        &quot;emailAddresses&quot;: &quot;mail&quot;,
</ins><span class="cx">                     },
</span><del>-                    &quot;expected&quot; : &quot;(&amp;(|(cn=*foo*)(mail=foo*)(mailAliases=foo*))(|(cn=*bar*)(mail=bar*)(mailAliases=bar*)))&quot;,
-                    &quot;extra&quot; : None,
</del><ins>+                    &quot;expected&quot;: &quot;(&amp;(|(cn=*bar*)(mail=bar*))(|(cn=*foo*)(mail=foo*)))&quot;,
+                    &quot;extra&quot;: None,
</ins><span class="cx">                 },
</span><span class="cx">                 {
</span><del>-                    &quot;tokens&quot; : [&quot;foo&quot;, &quot;bar&quot;, &quot;baz(&quot;],
-                    &quot;mapping&quot; : {
-                        &quot;fullName&quot; : &quot;cn&quot;,
-                        &quot;emailAddresses&quot; : &quot;mail&quot;,
</del><ins>+                    &quot;tokens&quot;: [&quot;foo&quot;, &quot;bar&quot;],
+                    &quot;mapping&quot;: {
+                        &quot;fullName&quot;: &quot;cn&quot;,
+                        &quot;emailAddresses&quot;: [&quot;mail&quot;, &quot;mailAliases&quot;],
</ins><span class="cx">                     },
</span><del>-                    &quot;expected&quot; : &quot;(&amp;(|(cn=*foo*)(mail=foo*))(|(cn=*bar*)(mail=bar*))(|(cn=*baz\\28*)(mail=baz\\28*)))&quot;,
-                    &quot;extra&quot; : None,
</del><ins>+                    &quot;expected&quot;: &quot;(&amp;(|(cn=*bar*)(mail=bar*)(mailAliases=bar*))(|(cn=*foo*)(mail=foo*)(mailAliases=foo*)))&quot;,
+                    &quot;extra&quot;: None,
</ins><span class="cx">                 },
</span><ins>+                {
+                    &quot;tokens&quot;: [&quot;foo&quot;, &quot;bar&quot;, &quot;baz(&quot;],
+                    &quot;mapping&quot;: {
+                        &quot;fullName&quot;: &quot;cn&quot;,
+                        &quot;emailAddresses&quot;: &quot;mail&quot;,
+                    },
+                    &quot;expected&quot;: &quot;(&amp;(|(cn=*bar*)(mail=bar*))(|(cn=*baz\\28*)(mail=baz\\28*))(|(cn=*foo*)(mail=foo*)))&quot;,
+                    &quot;extra&quot;: None,
+                },
</ins><span class="cx">             ]
</span><span class="cx">             for entry in entries:
</span><span class="cx">                 self.assertEquals(
</span><span class="lines">@@ -277,12 +300,13 @@
</span><span class="cx">                 )
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     class StubList(object):
</span><span class="cx">         def __init__(self, wrapper):
</span><span class="cx">             self.ldap = wrapper
</span><span class="cx"> 
</span><span class="cx">         def startSearch(self, base, scope, filterstr, attrList=None,
</span><del>-            timeout=-1, sizelimit=0):
</del><ins>+                        timeout=-1, sizelimit=0):
</ins><span class="cx">             self.base = base
</span><span class="cx">             self.scope = scope
</span><span class="cx">             self.filterstr = filterstr
</span><span class="lines">@@ -292,14 +316,17 @@
</span><span class="cx"> 
</span><span class="cx">         def processResults(self):
</span><span class="cx">             self.allResults = self.ldap.search_s(self.base, self.scope,
</span><del>-                self.filterstr, attrlist=self.attrList)
</del><ins>+                                                 self.filterstr,
+                                                 attrlist=self.attrList)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     class StubAsync(object):
</span><span class="cx">         def List(self, wrapper):
</span><span class="cx">             return StubList(wrapper)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     class LdapDirectoryTestWrapper(object):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         A test stub which replaces search_s( ) with a version that will return
</span><span class="lines">@@ -317,7 +344,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">         def search_s(self, base, scope, filterstr=&quot;(objectClass=*)&quot;,
</span><del>-            attrlist=None):
</del><ins>+                     attrlist=None):
</ins><span class="cx">             &quot;&quot;&quot; A simple implementation of LDAP search filter processing &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">             base = normalizeDNstr(base)
</span><span class="lines">@@ -475,8 +502,8 @@
</span><span class="cx">                         'givenName': ['Test'],
</span><span class="cx">                         'cn': ['Test Resource'],
</span><span class="cx">                         # purposely throw in an un-normalized GUID
</span><del>-                        'read-write-proxy' : ['6423f94a-6b76-4a3a-815b-d52cfd77935d'],
-                        'read-only-proxy' : ['5A985493-EE2C-4665-94CF-4DFEA3A89500'],
</del><ins>+                        'read-write-proxy': ['6423f94a-6b76-4a3a-815b-d52cfd77935d'],
+                        'read-only-proxy': ['5A985493-EE2C-4665-94CF-4DFEA3A89500'],
</ins><span class="cx">                     }
</span><span class="cx">                 ),
</span><span class="cx">                 (
</span><span class="lines">@@ -487,14 +514,14 @@
</span><span class="cx">                         'sn': ['Resource2'],
</span><span class="cx">                         'givenName': ['Test'],
</span><span class="cx">                         'cn': ['Test Resource2'],
</span><del>-                        'read-write-proxy' : ['6423F94A-6B76-4A3A-815B-D52CFD77935D'],
</del><ins>+                        'read-write-proxy': ['6423F94A-6B76-4A3A-815B-D52CFD77935D'],
</ins><span class="cx">                     }
</span><span class="cx">                 ),
</span><span class="cx">             ),
</span><span class="cx">             {
</span><del>-                &quot;augmentService&quot; : None,
-                &quot;groupMembershipCache&quot; : None,
-                &quot;cacheTimeout&quot;: 1, # Minutes
</del><ins>+                &quot;augmentService&quot;: None,
+                &quot;groupMembershipCache&quot;: None,
+                &quot;cacheTimeout&quot;: 1,  # Minutes
</ins><span class="cx">                 &quot;negativeCaching&quot;: False,
</span><span class="cx">                 &quot;warningThresholdSeconds&quot;: 3,
</span><span class="cx">                 &quot;batchSize&quot;: 500,
</span><span class="lines">@@ -506,7 +533,7 @@
</span><span class="cx">                 &quot;tls&quot;: False,
</span><span class="cx">                 &quot;tlsCACertFile&quot;: None,
</span><span class="cx">                 &quot;tlsCACertDir&quot;: None,
</span><del>-                &quot;tlsRequireCert&quot;: None, # never, allow, try, demand, hard
</del><ins>+                &quot;tlsRequireCert&quot;: None,  # never, allow, try, demand, hard
</ins><span class="cx">                 &quot;credentials&quot;: {
</span><span class="cx">                     &quot;dn&quot;: None,
</span><span class="cx">                     &quot;password&quot;: None,
</span><span class="lines">@@ -517,83 +544,83 @@
</span><span class="cx">                     &quot;guidAttr&quot;: &quot;apple-generateduid&quot;,
</span><span class="cx">                     &quot;users&quot;: {
</span><span class="cx">                         &quot;rdn&quot;: &quot;cn=Users&quot;,
</span><del>-                        &quot;attr&quot;: &quot;uid&quot;, # used only to synthesize email address
-                        &quot;emailSuffix&quot;: None, # used only to synthesize email address
-                        &quot;filter&quot;: &quot;&quot;, # additional filter for this type
-                        &quot;loginEnabledAttr&quot; : &quot;&quot;, # attribute controlling login
-                        &quot;loginEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                        &quot;calendarEnabledAttr&quot; : &quot;enable-calendar&quot;, # attribute controlling calendaring
-                        &quot;calendarEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                        &quot;mapping&quot;: { # maps internal record names to LDAP
</del><ins>+                        &quot;attr&quot;: &quot;uid&quot;,  # used only to synthesize email address
+                        &quot;emailSuffix&quot;: None,  # used only to synthesize email address
+                        &quot;filter&quot;: &quot;&quot;,  # additional filter for this type
+                        &quot;loginEnabledAttr&quot;: &quot;&quot;,  # attribute controlling login
+                        &quot;loginEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                        &quot;calendarEnabledAttr&quot;: &quot;enable-calendar&quot;,  # attribute controlling calendaring
+                        &quot;calendarEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                        &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                             &quot;recordName&quot;: &quot;uid&quot;,
</span><del>-                            &quot;fullName&quot; : &quot;cn&quot;,
-                            &quot;emailAddresses&quot; : [&quot;mail&quot;, &quot;emailAliases&quot;],
-                            &quot;firstName&quot; : &quot;givenName&quot;,
-                            &quot;lastName&quot; : &quot;sn&quot;,
</del><ins>+                            &quot;fullName&quot;: &quot;cn&quot;,
+                            &quot;emailAddresses&quot;: [&quot;mail&quot;, &quot;emailAliases&quot;],
+                            &quot;firstName&quot;: &quot;givenName&quot;,
+                            &quot;lastName&quot;: &quot;sn&quot;,
</ins><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                     &quot;groups&quot;: {
</span><span class="cx">                         &quot;rdn&quot;: &quot;cn=Groups&quot;,
</span><del>-                        &quot;attr&quot;: &quot;cn&quot;, # used only to synthesize email address
-                        &quot;emailSuffix&quot;: None, # used only to synthesize email address
-                        &quot;filter&quot;: &quot;&quot;, # additional filter for this type
-                        &quot;mapping&quot;: { # maps internal record names to LDAP
</del><ins>+                        &quot;attr&quot;: &quot;cn&quot;,  # used only to synthesize email address
+                        &quot;emailSuffix&quot;: None,  # used only to synthesize email address
+                        &quot;filter&quot;: &quot;&quot;,  # additional filter for this type
+                        &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                             &quot;recordName&quot;: &quot;cn&quot;,
</span><del>-                            &quot;fullName&quot; : &quot;cn&quot;,
-                            &quot;emailAddresses&quot; : [&quot;mail&quot;, &quot;emailAliases&quot;],
</del><ins>+                            &quot;fullName&quot;: &quot;cn&quot;,
+                            &quot;emailAddresses&quot;: [&quot;mail&quot;, &quot;emailAliases&quot;],
</ins><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                     &quot;locations&quot;: {
</span><span class="cx">                         &quot;rdn&quot;: &quot;cn=Places&quot;,
</span><del>-                        &quot;attr&quot;: &quot;cn&quot;, # used only to synthesize email address
-                        &quot;emailSuffix&quot;: None, # used only to synthesize email address
-                        &quot;filter&quot;: &quot;(objectClass=apple-resource)&quot;, # additional filter for this type
-                        &quot;calendarEnabledAttr&quot; : &quot;&quot;, # attribute controlling calendaring
-                        &quot;calendarEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                        &quot;associatedAddressAttr&quot; : &quot;assocAddr&quot;,
-                        &quot;mapping&quot;: { # maps internal record names to LDAP
</del><ins>+                        &quot;attr&quot;: &quot;cn&quot;,  # used only to synthesize email address
+                        &quot;emailSuffix&quot;: None,  # used only to synthesize email address
+                        &quot;filter&quot;: &quot;(objectClass=apple-resource)&quot;,  # additional filter for this type
+                        &quot;calendarEnabledAttr&quot;: &quot;&quot;,  # attribute controlling calendaring
+                        &quot;calendarEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                        &quot;associatedAddressAttr&quot;: &quot;assocAddr&quot;,
+                        &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                             &quot;recordName&quot;: &quot;cn&quot;,
</span><del>-                            &quot;fullName&quot; : &quot;cn&quot;,
-                            &quot;emailAddresses&quot; : &quot;&quot;, # old style, single string
</del><ins>+                            &quot;fullName&quot;: &quot;cn&quot;,
+                            &quot;emailAddresses&quot;: &quot;&quot;,  # old style, single string
</ins><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                     &quot;resources&quot;: {
</span><span class="cx">                         &quot;rdn&quot;: &quot;cn=Resources&quot;,
</span><del>-                        &quot;attr&quot;: &quot;cn&quot;, # used only to synthesize email address
-                        &quot;emailSuffix&quot;: None, # used only to synthesize email address
-                        &quot;filter&quot;: &quot;(objectClass=apple-resource)&quot;, # additional filter for this type
-                        &quot;calendarEnabledAttr&quot; : &quot;&quot;, # attribute controlling calendaring
-                        &quot;calendarEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                        &quot;mapping&quot;: { # maps internal record names to LDAP
</del><ins>+                        &quot;attr&quot;: &quot;cn&quot;,  # used only to synthesize email address
+                        &quot;emailSuffix&quot;: None,  # used only to synthesize email address
+                        &quot;filter&quot;: &quot;(objectClass=apple-resource)&quot;,  # additional filter for this type
+                        &quot;calendarEnabledAttr&quot;: &quot;&quot;,  # attribute controlling calendaring
+                        &quot;calendarEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                        &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                             &quot;recordName&quot;: &quot;cn&quot;,
</span><del>-                            &quot;fullName&quot; : &quot;cn&quot;,
-                            &quot;emailAddresses&quot; : [], # new style, array
</del><ins>+                            &quot;fullName&quot;: &quot;cn&quot;,
+                            &quot;emailAddresses&quot;: [],  # new style, array
</ins><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                     &quot;addresses&quot;: {
</span><span class="cx">                         &quot;rdn&quot;: &quot;cn=Buildings&quot;,
</span><del>-                        &quot;geoAttr&quot; : &quot;coordinates&quot;,
-                        &quot;streetAddressAttr&quot; : &quot;postal&quot;,
-                        &quot;mapping&quot;: { # maps internal record names to LDAP
</del><ins>+                        &quot;geoAttr&quot;: &quot;coordinates&quot;,
+                        &quot;streetAddressAttr&quot;: &quot;postal&quot;,
+                        &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                             &quot;recordName&quot;: &quot;cn&quot;,
</span><del>-                            &quot;fullName&quot; : &quot;cn&quot;,
</del><ins>+                            &quot;fullName&quot;: &quot;cn&quot;,
</ins><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                 },
</span><span class="cx">                 &quot;groupSchema&quot;: {
</span><del>-                    &quot;membersAttr&quot;: &quot;uniqueMember&quot;, # how members are specified
-                    &quot;nestedGroupsAttr&quot;: &quot;nestedGroups&quot;, # how nested groups are specified
-                    &quot;memberIdAttr&quot;: &quot;&quot;, # which attribute the above refer to
</del><ins>+                    &quot;membersAttr&quot;: &quot;uniqueMember&quot;,  # how members are specified
+                    &quot;nestedGroupsAttr&quot;: &quot;nestedGroups&quot;,  # how nested groups are specified
+                    &quot;memberIdAttr&quot;: &quot;&quot;,  # which attribute the above refer to
</ins><span class="cx">                 },
</span><span class="cx">                 &quot;resourceSchema&quot;: {
</span><del>-                    &quot;resourceInfoAttr&quot;: &quot;apple-resource-info&quot;, # contains location/resource info
</del><ins>+                    &quot;resourceInfoAttr&quot;: &quot;apple-resource-info&quot;,  # contains location/resource info
</ins><span class="cx">                     &quot;autoScheduleAttr&quot;: None,
</span><span class="cx">                     &quot;proxyAttr&quot;: &quot;read-write-proxy&quot;,
</span><span class="cx">                     &quot;readOnlyProxyAttr&quot;: &quot;read-only-proxy&quot;,
</span><span class="cx">                     &quot;autoAcceptGroupAttr&quot;: None,
</span><span class="cx">                 },
</span><span class="cx">                 &quot;poddingSchema&quot;: {
</span><del>-                    &quot;serverIdAttr&quot;: &quot;server-id&quot;, # maps to augments server-id
</del><ins>+                    &quot;serverIdAttr&quot;: &quot;server-id&quot;,  # maps to augments server-id
</ins><span class="cx">                 },
</span><span class="cx">             }
</span><span class="cx">         )
</span><span class="lines">@@ -711,9 +738,9 @@
</span><span class="cx">                 ),
</span><span class="cx">             ),
</span><span class="cx">             {
</span><del>-                &quot;augmentService&quot; : None,
-                &quot;groupMembershipCache&quot; : None,
-                &quot;cacheTimeout&quot;: 1, # Minutes
</del><ins>+                &quot;augmentService&quot;: None,
+                &quot;groupMembershipCache&quot;: None,
+                &quot;cacheTimeout&quot;: 1,  # Minutes
</ins><span class="cx">                 &quot;negativeCaching&quot;: False,
</span><span class="cx">                 &quot;warningThresholdSeconds&quot;: 3,
</span><span class="cx">                 &quot;batchSize&quot;: 500,
</span><span class="lines">@@ -725,7 +752,7 @@
</span><span class="cx">                 &quot;tls&quot;: False,
</span><span class="cx">                 &quot;tlsCACertFile&quot;: None,
</span><span class="cx">                 &quot;tlsCACertDir&quot;: None,
</span><del>-                &quot;tlsRequireCert&quot;: None, # never, allow, try, demand, hard
</del><ins>+                &quot;tlsRequireCert&quot;: None,  # never, allow, try, demand, hard
</ins><span class="cx">                 &quot;credentials&quot;: {
</span><span class="cx">                     &quot;dn&quot;: None,
</span><span class="cx">                     &quot;password&quot;: None,
</span><span class="lines">@@ -736,79 +763,79 @@
</span><span class="cx">                     &quot;guidAttr&quot;: &quot;apple-generateduid&quot;,
</span><span class="cx">                     &quot;users&quot;: {
</span><span class="cx">                         &quot;rdn&quot;: &quot;cn=Users&quot;,
</span><del>-                        &quot;attr&quot;: &quot;uid&quot;, # used only to synthesize email address
-                        &quot;emailSuffix&quot;: None, # used only to synthesize email address
-                        &quot;filter&quot;: &quot;&quot;, # additional filter for this type
-                        &quot;loginEnabledAttr&quot; : &quot;&quot;, # attribute controlling login
-                        &quot;loginEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                        &quot;calendarEnabledAttr&quot; : &quot;enable-calendar&quot;, # attribute controlling calendaring
-                        &quot;calendarEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                        &quot;mapping&quot;: { # maps internal record names to LDAP
</del><ins>+                        &quot;attr&quot;: &quot;uid&quot;,  # used only to synthesize email address
+                        &quot;emailSuffix&quot;: None,  # used only to synthesize email address
+                        &quot;filter&quot;: &quot;&quot;,  # additional filter for this type
+                        &quot;loginEnabledAttr&quot;: &quot;&quot;,  # attribute controlling login
+                        &quot;loginEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                        &quot;calendarEnabledAttr&quot;: &quot;enable-calendar&quot;,  # attribute controlling calendaring
+                        &quot;calendarEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                        &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                             &quot;recordName&quot;: &quot;uid&quot;,
</span><del>-                            &quot;fullName&quot; : &quot;cn&quot;,
-                            &quot;emailAddresses&quot; : [&quot;mail&quot;, &quot;emailAliases&quot;],
-                            &quot;firstName&quot; : &quot;givenName&quot;,
-                            &quot;lastName&quot; : &quot;sn&quot;,
</del><ins>+                            &quot;fullName&quot;: &quot;cn&quot;,
+                            &quot;emailAddresses&quot;: [&quot;mail&quot;, &quot;emailAliases&quot;],
+                            &quot;firstName&quot;: &quot;givenName&quot;,
+                            &quot;lastName&quot;: &quot;sn&quot;,
</ins><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                     &quot;groups&quot;: {
</span><span class="cx">                         &quot;rdn&quot;: &quot;cn=Groups&quot;,
</span><del>-                        &quot;attr&quot;: &quot;cn&quot;, # used only to synthesize email address
-                        &quot;emailSuffix&quot;: None, # used only to synthesize email address
-                        &quot;filter&quot;: &quot;&quot;, # additional filter for this type
-                        &quot;mapping&quot;: { # maps internal record names to LDAP
</del><ins>+                        &quot;attr&quot;: &quot;cn&quot;,  # used only to synthesize email address
+                        &quot;emailSuffix&quot;: None,  # used only to synthesize email address
+                        &quot;filter&quot;: &quot;&quot;,  # additional filter for this type
+                        &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                             &quot;recordName&quot;: &quot;cn&quot;,
</span><del>-                            &quot;fullName&quot; : &quot;cn&quot;,
-                            &quot;emailAddresses&quot; : [&quot;mail&quot;, &quot;emailAliases&quot;],
-                            &quot;firstName&quot; : &quot;givenName&quot;,
-                            &quot;lastName&quot; : &quot;sn&quot;,
</del><ins>+                            &quot;fullName&quot;: &quot;cn&quot;,
+                            &quot;emailAddresses&quot;: [&quot;mail&quot;, &quot;emailAliases&quot;],
+                            &quot;firstName&quot;: &quot;givenName&quot;,
+                            &quot;lastName&quot;: &quot;sn&quot;,
</ins><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                     &quot;locations&quot;: {
</span><span class="cx">                         &quot;rdn&quot;: &quot;cn=Places&quot;,
</span><del>-                        &quot;attr&quot;: &quot;cn&quot;, # used only to synthesize email address
-                        &quot;emailSuffix&quot;: None, # used only to synthesize email address
-                        &quot;filter&quot;: &quot;(objectClass=apple-resource)&quot;, # additional filter for this type
-                        &quot;calendarEnabledAttr&quot; : &quot;&quot;, # attribute controlling calendaring
-                        &quot;calendarEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                        &quot;mapping&quot;: { # maps internal record names to LDAP
</del><ins>+                        &quot;attr&quot;: &quot;cn&quot;,  # used only to synthesize email address
+                        &quot;emailSuffix&quot;: None,  # used only to synthesize email address
+                        &quot;filter&quot;: &quot;(objectClass=apple-resource)&quot;,  # additional filter for this type
+                        &quot;calendarEnabledAttr&quot;: &quot;&quot;,  # attribute controlling calendaring
+                        &quot;calendarEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                        &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                             &quot;recordName&quot;: &quot;cn&quot;,
</span><del>-                            &quot;fullName&quot; : &quot;cn&quot;,
-                            &quot;emailAddresses&quot; : &quot;&quot;, # old style, single string
-                            &quot;firstName&quot; : &quot;givenName&quot;,
-                            &quot;lastName&quot; : &quot;sn&quot;,
</del><ins>+                            &quot;fullName&quot;: &quot;cn&quot;,
+                            &quot;emailAddresses&quot;: &quot;&quot;,  # old style, single string
+                            &quot;firstName&quot;: &quot;givenName&quot;,
+                            &quot;lastName&quot;: &quot;sn&quot;,
</ins><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                     &quot;resources&quot;: {
</span><span class="cx">                         &quot;rdn&quot;: &quot;cn=Resources&quot;,
</span><del>-                        &quot;attr&quot;: &quot;cn&quot;, # used only to synthesize email address
-                        &quot;emailSuffix&quot;: None, # used only to synthesize email address
-                        &quot;filter&quot;: &quot;(objectClass=apple-resource)&quot;, # additional filter for this type
-                        &quot;calendarEnabledAttr&quot; : &quot;&quot;, # attribute controlling calendaring
-                        &quot;calendarEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                        &quot;mapping&quot;: { # maps internal record names to LDAP
</del><ins>+                        &quot;attr&quot;: &quot;cn&quot;,  # used only to synthesize email address
+                        &quot;emailSuffix&quot;: None,  # used only to synthesize email address
+                        &quot;filter&quot;: &quot;(objectClass=apple-resource)&quot;,  # additional filter for this type
+                        &quot;calendarEnabledAttr&quot;: &quot;&quot;,  # attribute controlling calendaring
+                        &quot;calendarEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                        &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                             &quot;recordName&quot;: &quot;cn&quot;,
</span><del>-                            &quot;fullName&quot; : &quot;cn&quot;,
-                            &quot;emailAddresses&quot; : [], # new style, array
-                            &quot;firstName&quot; : &quot;givenName&quot;,
-                            &quot;lastName&quot; : &quot;sn&quot;,
</del><ins>+                            &quot;fullName&quot;: &quot;cn&quot;,
+                            &quot;emailAddresses&quot;: [],  # new style, array
+                            &quot;firstName&quot;: &quot;givenName&quot;,
+                            &quot;lastName&quot;: &quot;sn&quot;,
</ins><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                 },
</span><span class="cx">                 &quot;groupSchema&quot;: {
</span><del>-                    &quot;membersAttr&quot;: &quot;uniqueMember&quot;, # how members are specified
-                    &quot;nestedGroupsAttr&quot;: &quot;&quot;, # how nested groups are specified
-                    &quot;memberIdAttr&quot;: &quot;&quot;, # which attribute the above refer to
</del><ins>+                    &quot;membersAttr&quot;: &quot;uniqueMember&quot;,  # how members are specified
+                    &quot;nestedGroupsAttr&quot;: &quot;&quot;,  # how nested groups are specified
+                    &quot;memberIdAttr&quot;: &quot;&quot;,  # which attribute the above refer to
</ins><span class="cx">                 },
</span><span class="cx">                 &quot;resourceSchema&quot;: {
</span><del>-                    &quot;resourceInfoAttr&quot;: &quot;apple-resource-info&quot;, # contains location/resource info
</del><ins>+                    &quot;resourceInfoAttr&quot;: &quot;apple-resource-info&quot;,  # contains location/resource info
</ins><span class="cx">                     &quot;autoScheduleAttr&quot;: None,
</span><span class="cx">                     &quot;proxyAttr&quot;: None,
</span><span class="cx">                     &quot;readOnlyProxyAttr&quot;: None,
</span><span class="cx">                     &quot;autoAcceptGroupAttr&quot;: None,
</span><span class="cx">                 },
</span><span class="cx">                 &quot;poddingSchema&quot;: {
</span><del>-                    &quot;serverIdAttr&quot;: &quot;server-id&quot;, # maps to augments server-id
</del><ins>+                    &quot;serverIdAttr&quot;: &quot;server-id&quot;,  # maps to augments server-id
</ins><span class="cx">                 },
</span><span class="cx">             }
</span><span class="cx">         )
</span><span class="lines">@@ -928,9 +955,9 @@
</span><span class="cx">                 ),
</span><span class="cx">             ),
</span><span class="cx">             {
</span><del>-                &quot;augmentService&quot; : None,
-                &quot;groupMembershipCache&quot; : None,
-                &quot;cacheTimeout&quot;: 1, # Minutes
</del><ins>+                &quot;augmentService&quot;: None,
+                &quot;groupMembershipCache&quot;: None,
+                &quot;cacheTimeout&quot;: 1,  # Minutes
</ins><span class="cx">                 &quot;negativeCaching&quot;: False,
</span><span class="cx">                 &quot;warningThresholdSeconds&quot;: 3,
</span><span class="cx">                 &quot;batchSize&quot;: 500,
</span><span class="lines">@@ -942,7 +969,7 @@
</span><span class="cx">                 &quot;tls&quot;: False,
</span><span class="cx">                 &quot;tlsCACertFile&quot;: None,
</span><span class="cx">                 &quot;tlsCACertDir&quot;: None,
</span><del>-                &quot;tlsRequireCert&quot;: None, # never, allow, try, demand, hard
</del><ins>+                &quot;tlsRequireCert&quot;: None,  # never, allow, try, demand, hard
</ins><span class="cx">                 &quot;credentials&quot;: {
</span><span class="cx">                     &quot;dn&quot;: None,
</span><span class="cx">                     &quot;password&quot;: None,
</span><span class="lines">@@ -953,79 +980,79 @@
</span><span class="cx">                     &quot;guidAttr&quot;: &quot;apple-generateduid&quot;,
</span><span class="cx">                     &quot;users&quot;: {
</span><span class="cx">                         &quot;rdn&quot;: &quot;cn=Users&quot;,
</span><del>-                        &quot;attr&quot;: &quot;uid&quot;, # used only to synthesize email address
-                        &quot;emailSuffix&quot;: None, # used only to synthesize email address
-                        &quot;filter&quot;: &quot;&quot;, # additional filter for this type
-                        &quot;loginEnabledAttr&quot; : &quot;&quot;, # attribute controlling login
-                        &quot;loginEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                        &quot;calendarEnabledAttr&quot; : &quot;enable-calendar&quot;, # attribute controlling calendaring
-                        &quot;calendarEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                        &quot;mapping&quot;: { # maps internal record names to LDAP
</del><ins>+                        &quot;attr&quot;: &quot;uid&quot;,  # used only to synthesize email address
+                        &quot;emailSuffix&quot;: None,  # used only to synthesize email address
+                        &quot;filter&quot;: &quot;&quot;,  # additional filter for this type
+                        &quot;loginEnabledAttr&quot;: &quot;&quot;,  # attribute controlling login
+                        &quot;loginEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                        &quot;calendarEnabledAttr&quot;: &quot;enable-calendar&quot;,  # attribute controlling calendaring
+                        &quot;calendarEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                        &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                             &quot;recordName&quot;: &quot;uid&quot;,
</span><del>-                            &quot;fullName&quot; : &quot;cn&quot;,
-                            &quot;emailAddresses&quot; : [&quot;mail&quot;, &quot;emailAliases&quot;],
-                            &quot;firstName&quot; : &quot;givenName&quot;,
-                            &quot;lastName&quot; : &quot;sn&quot;,
</del><ins>+                            &quot;fullName&quot;: &quot;cn&quot;,
+                            &quot;emailAddresses&quot;: [&quot;mail&quot;, &quot;emailAliases&quot;],
+                            &quot;firstName&quot;: &quot;givenName&quot;,
+                            &quot;lastName&quot;: &quot;sn&quot;,
</ins><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                     &quot;groups&quot;: {
</span><span class="cx">                         &quot;rdn&quot;: &quot;cn=Groups&quot;,
</span><del>-                        &quot;attr&quot;: &quot;cn&quot;, # used only to synthesize email address
-                        &quot;emailSuffix&quot;: None, # used only to synthesize email address
-                        &quot;filter&quot;: &quot;&quot;, # additional filter for this type
-                        &quot;mapping&quot;: { # maps internal record names to LDAP
</del><ins>+                        &quot;attr&quot;: &quot;cn&quot;,  # used only to synthesize email address
+                        &quot;emailSuffix&quot;: None,  # used only to synthesize email address
+                        &quot;filter&quot;: &quot;&quot;,  # additional filter for this type
+                        &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                             &quot;recordName&quot;: &quot;cn&quot;,
</span><del>-                            &quot;fullName&quot; : &quot;cn&quot;,
-                            &quot;emailAddresses&quot; : [&quot;mail&quot;, &quot;emailAliases&quot;],
-                            &quot;firstName&quot; : &quot;givenName&quot;,
-                            &quot;lastName&quot; : &quot;sn&quot;,
</del><ins>+                            &quot;fullName&quot;: &quot;cn&quot;,
+                            &quot;emailAddresses&quot;: [&quot;mail&quot;, &quot;emailAliases&quot;],
+                            &quot;firstName&quot;: &quot;givenName&quot;,
+                            &quot;lastName&quot;: &quot;sn&quot;,
</ins><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                     &quot;locations&quot;: {
</span><span class="cx">                         &quot;rdn&quot;: &quot;cn=Places&quot;,
</span><del>-                        &quot;attr&quot;: &quot;cn&quot;, # used only to synthesize email address
-                        &quot;emailSuffix&quot;: None, # used only to synthesize email address
-                        &quot;filter&quot;: &quot;(objectClass=apple-resource)&quot;, # additional filter for this type
-                        &quot;calendarEnabledAttr&quot; : &quot;&quot;, # attribute controlling calendaring
-                        &quot;calendarEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                        &quot;mapping&quot;: { # maps internal record names to LDAP
</del><ins>+                        &quot;attr&quot;: &quot;cn&quot;,  # used only to synthesize email address
+                        &quot;emailSuffix&quot;: None,  # used only to synthesize email address
+                        &quot;filter&quot;: &quot;(objectClass=apple-resource)&quot;,  # additional filter for this type
+                        &quot;calendarEnabledAttr&quot;: &quot;&quot;,  # attribute controlling calendaring
+                        &quot;calendarEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                        &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                             &quot;recordName&quot;: &quot;cn&quot;,
</span><del>-                            &quot;fullName&quot; : &quot;cn&quot;,
-                            &quot;emailAddresses&quot; : &quot;&quot;, # old style, single string
-                            &quot;firstName&quot; : &quot;givenName&quot;,
-                            &quot;lastName&quot; : &quot;sn&quot;,
</del><ins>+                            &quot;fullName&quot;: &quot;cn&quot;,
+                            &quot;emailAddresses&quot;: &quot;&quot;,  # old style, single string
+                            &quot;firstName&quot;: &quot;givenName&quot;,
+                            &quot;lastName&quot;: &quot;sn&quot;,
</ins><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                     &quot;resources&quot;: {
</span><span class="cx">                         &quot;rdn&quot;: &quot;cn=Resources&quot;,
</span><del>-                        &quot;attr&quot;: &quot;cn&quot;, # used only to synthesize email address
-                        &quot;emailSuffix&quot;: None, # used only to synthesize email address
-                        &quot;filter&quot;: &quot;(objectClass=apple-resource)&quot;, # additional filter for this type
-                        &quot;calendarEnabledAttr&quot; : &quot;&quot;, # attribute controlling calendaring
-                        &quot;calendarEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                        &quot;mapping&quot;: { # maps internal record names to LDAP
</del><ins>+                        &quot;attr&quot;: &quot;cn&quot;,  # used only to synthesize email address
+                        &quot;emailSuffix&quot;: None,  # used only to synthesize email address
+                        &quot;filter&quot;: &quot;(objectClass=apple-resource)&quot;,  # additional filter for this type
+                        &quot;calendarEnabledAttr&quot;: &quot;&quot;,  # attribute controlling calendaring
+                        &quot;calendarEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                        &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                             &quot;recordName&quot;: &quot;cn&quot;,
</span><del>-                            &quot;fullName&quot; : &quot;cn&quot;,
-                            &quot;emailAddresses&quot; : [], # new style, array
-                            &quot;firstName&quot; : &quot;givenName&quot;,
-                            &quot;lastName&quot; : &quot;sn&quot;,
</del><ins>+                            &quot;fullName&quot;: &quot;cn&quot;,
+                            &quot;emailAddresses&quot;: [],  # new style, array
+                            &quot;firstName&quot;: &quot;givenName&quot;,
+                            &quot;lastName&quot;: &quot;sn&quot;,
</ins><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                 },
</span><span class="cx">                 &quot;groupSchema&quot;: {
</span><del>-                    &quot;membersAttr&quot;: &quot;uniqueMember&quot;, # how members are specified
-                    &quot;nestedGroupsAttr&quot;: &quot;nestedGroups&quot;, # how nested groups are specified
-                    &quot;memberIdAttr&quot;: &quot;apple-generateduid&quot;, # which attribute the above refer to
</del><ins>+                    &quot;membersAttr&quot;: &quot;uniqueMember&quot;,  # how members are specified
+                    &quot;nestedGroupsAttr&quot;: &quot;nestedGroups&quot;,  # how nested groups are specified
+                    &quot;memberIdAttr&quot;: &quot;apple-generateduid&quot;,  # which attribute the above refer to
</ins><span class="cx">                 },
</span><span class="cx">                 &quot;resourceSchema&quot;: {
</span><del>-                    &quot;resourceInfoAttr&quot;: &quot;apple-resource-info&quot;, # contains location/resource info
</del><ins>+                    &quot;resourceInfoAttr&quot;: &quot;apple-resource-info&quot;,  # contains location/resource info
</ins><span class="cx">                     &quot;autoScheduleAttr&quot;: None,
</span><span class="cx">                     &quot;proxyAttr&quot;: None,
</span><span class="cx">                     &quot;readOnlyProxyAttr&quot;: None,
</span><span class="cx">                     &quot;autoAcceptGroupAttr&quot;: None,
</span><span class="cx">                 },
</span><span class="cx">                 &quot;poddingSchema&quot;: {
</span><del>-                    &quot;serverIdAttr&quot;: &quot;server-id&quot;, # maps to augments server-id
</del><ins>+                    &quot;serverIdAttr&quot;: &quot;server-id&quot;,  # maps to augments server-id
</ins><span class="cx">                 },
</span><span class="cx">             }
</span><span class="cx">         )
</span><span class="lines">@@ -1141,9 +1168,9 @@
</span><span class="cx">                 ),
</span><span class="cx">             ),
</span><span class="cx">             {
</span><del>-                &quot;augmentService&quot; : None,
-                &quot;groupMembershipCache&quot; : None,
-                &quot;cacheTimeout&quot;: 1, # Minutes
</del><ins>+                &quot;augmentService&quot;: None,
+                &quot;groupMembershipCache&quot;: None,
+                &quot;cacheTimeout&quot;: 1,  # Minutes
</ins><span class="cx">                 &quot;negativeCaching&quot;: False,
</span><span class="cx">                 &quot;warningThresholdSeconds&quot;: 3,
</span><span class="cx">                 &quot;batchSize&quot;: 500,
</span><span class="lines">@@ -1155,7 +1182,7 @@
</span><span class="cx">                 &quot;tls&quot;: False,
</span><span class="cx">                 &quot;tlsCACertFile&quot;: None,
</span><span class="cx">                 &quot;tlsCACertDir&quot;: None,
</span><del>-                &quot;tlsRequireCert&quot;: None, # never, allow, try, demand, hard
</del><ins>+                &quot;tlsRequireCert&quot;: None,  # never, allow, try, demand, hard
</ins><span class="cx">                 &quot;credentials&quot;: {
</span><span class="cx">                     &quot;dn&quot;: None,
</span><span class="cx">                     &quot;password&quot;: None,
</span><span class="lines">@@ -1166,83 +1193,84 @@
</span><span class="cx">                     &quot;guidAttr&quot;: &quot;apple-generateduid&quot;,
</span><span class="cx">                     &quot;users&quot;: {
</span><span class="cx">                         &quot;rdn&quot;: &quot;cn=Users&quot;,
</span><del>-                        &quot;attr&quot;: &quot;uid&quot;, # used only to synthesize email address
-                        &quot;emailSuffix&quot;: None, # used only to synthesize email address
-                        &quot;filter&quot;: &quot;&quot;, # additional filter for this type
-                        &quot;loginEnabledAttr&quot; : &quot;&quot;, # attribute controlling login
-                        &quot;loginEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                        &quot;calendarEnabledAttr&quot; : &quot;enable-calendar&quot;, # attribute controlling calendaring
-                        &quot;calendarEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                        &quot;mapping&quot;: { # maps internal record names to LDAP
</del><ins>+                        &quot;attr&quot;: &quot;uid&quot;,  # used only to synthesize email address
+                        &quot;emailSuffix&quot;: None,  # used only to synthesize email address
+                        &quot;filter&quot;: &quot;&quot;,  # additional filter for this type
+                        &quot;loginEnabledAttr&quot;: &quot;&quot;,  # attribute controlling login
+                        &quot;loginEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                        &quot;calendarEnabledAttr&quot;: &quot;enable-calendar&quot;,  # attribute controlling calendaring
+                        &quot;calendarEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                        &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                             &quot;recordName&quot;: &quot;uid&quot;,
</span><del>-                            &quot;fullName&quot; : &quot;cn&quot;,
-                            &quot;emailAddresses&quot; : [&quot;mail&quot;, &quot;emailAliases&quot;],
-                            &quot;firstName&quot; : &quot;givenName&quot;,
-                            &quot;lastName&quot; : &quot;sn&quot;,
</del><ins>+                            &quot;fullName&quot;: &quot;cn&quot;,
+                            &quot;emailAddresses&quot;: [&quot;mail&quot;, &quot;emailAliases&quot;],
+                            &quot;firstName&quot;: &quot;givenName&quot;,
+                            &quot;lastName&quot;: &quot;sn&quot;,
</ins><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                     &quot;groups&quot;: {
</span><span class="cx">                         &quot;rdn&quot;: &quot;cn=Groups&quot;,
</span><del>-                        &quot;attr&quot;: &quot;cn&quot;, # used only to synthesize email address
-                        &quot;emailSuffix&quot;: None, # used only to synthesize email address
-                        &quot;filter&quot;: &quot;&quot;, # additional filter for this type
-                        &quot;mapping&quot;: { # maps internal record names to LDAP
</del><ins>+                        &quot;attr&quot;: &quot;cn&quot;,  # used only to synthesize email address
+                        &quot;emailSuffix&quot;: None,  # used only to synthesize email address
+                        &quot;filter&quot;: &quot;&quot;,  # additional filter for this type
+                        &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                             &quot;recordName&quot;: &quot;cn&quot;,
</span><del>-                            &quot;fullName&quot; : &quot;cn&quot;,
-                            &quot;emailAddresses&quot; : [&quot;mail&quot;, &quot;emailAliases&quot;],
-                            &quot;firstName&quot; : &quot;givenName&quot;,
-                            &quot;lastName&quot; : &quot;sn&quot;,
</del><ins>+                            &quot;fullName&quot;: &quot;cn&quot;,
+                            &quot;emailAddresses&quot;: [&quot;mail&quot;, &quot;emailAliases&quot;],
+                            &quot;firstName&quot;: &quot;givenName&quot;,
+                            &quot;lastName&quot;: &quot;sn&quot;,
</ins><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                     &quot;locations&quot;: {
</span><span class="cx">                         &quot;rdn&quot;: &quot;cn=Places&quot;,
</span><del>-                        &quot;attr&quot;: &quot;cn&quot;, # used only to synthesize email address
-                        &quot;emailSuffix&quot;: None, # used only to synthesize email address
-                        &quot;filter&quot;: &quot;(objectClass=apple-resource)&quot;, # additional filter for this type
-                        &quot;calendarEnabledAttr&quot; : &quot;&quot;, # attribute controlling calendaring
-                        &quot;calendarEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                        &quot;mapping&quot;: { # maps internal record names to LDAP
</del><ins>+                        &quot;attr&quot;: &quot;cn&quot;,  # used only to synthesize email address
+                        &quot;emailSuffix&quot;: None,  # used only to synthesize email address
+                        &quot;filter&quot;: &quot;(objectClass=apple-resource)&quot;,  # additional filter for this type
+                        &quot;calendarEnabledAttr&quot;: &quot;&quot;,  # attribute controlling calendaring
+                        &quot;calendarEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                        &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                             &quot;recordName&quot;: &quot;cn&quot;,
</span><del>-                            &quot;fullName&quot; : &quot;cn&quot;,
-                            &quot;emailAddresses&quot; : &quot;&quot;, # old style, single string
-                            &quot;firstName&quot; : &quot;givenName&quot;,
-                            &quot;lastName&quot; : &quot;sn&quot;,
</del><ins>+                            &quot;fullName&quot;: &quot;cn&quot;,
+                            &quot;emailAddresses&quot;: &quot;&quot;,  # old style, single string
+                            &quot;firstName&quot;: &quot;givenName&quot;,
+                            &quot;lastName&quot;: &quot;sn&quot;,
</ins><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                     &quot;resources&quot;: {
</span><span class="cx">                         &quot;rdn&quot;: &quot;cn=Resources&quot;,
</span><del>-                        &quot;attr&quot;: &quot;cn&quot;, # used only to synthesize email address
-                        &quot;emailSuffix&quot;: None, # used only to synthesize email address
-                        &quot;filter&quot;: &quot;(objectClass=apple-resource)&quot;, # additional filter for this type
-                        &quot;calendarEnabledAttr&quot; : &quot;&quot;, # attribute controlling calendaring
-                        &quot;calendarEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
-                        &quot;mapping&quot;: { # maps internal record names to LDAP
</del><ins>+                        &quot;attr&quot;: &quot;cn&quot;,  # used only to synthesize email address
+                        &quot;emailSuffix&quot;: None,  # used only to synthesize email address
+                        &quot;filter&quot;: &quot;(objectClass=apple-resource)&quot;,  # additional filter for this type
+                        &quot;calendarEnabledAttr&quot;: &quot;&quot;,  # attribute controlling calendaring
+                        &quot;calendarEnabledValue&quot;: &quot;yes&quot;,  # &quot;True&quot; value of above attribute
+                        &quot;mapping&quot;: {  # maps internal record names to LDAP
</ins><span class="cx">                             &quot;recordName&quot;: &quot;cn&quot;,
</span><del>-                            &quot;fullName&quot; : &quot;cn&quot;,
-                            &quot;emailAddresses&quot; : [], # new style, array
-                            &quot;firstName&quot; : &quot;givenName&quot;,
-                            &quot;lastName&quot; : &quot;sn&quot;,
</del><ins>+                            &quot;fullName&quot;: &quot;cn&quot;,
+                            &quot;emailAddresses&quot;: [],  # new style, array
+                            &quot;firstName&quot;: &quot;givenName&quot;,
+                            &quot;lastName&quot;: &quot;sn&quot;,
</ins><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                 },
</span><span class="cx">                 &quot;groupSchema&quot;: {
</span><del>-                    &quot;membersAttr&quot;: &quot;uniqueMember&quot;, # how members are specified
-                    &quot;nestedGroupsAttr&quot;: &quot;&quot;, # how nested groups are specified
-                    &quot;memberIdAttr&quot;: &quot;apple-generateduid&quot;, # which attribute the above refer to
</del><ins>+                    &quot;membersAttr&quot;: &quot;uniqueMember&quot;,  # how members are specified
+                    &quot;nestedGroupsAttr&quot;: &quot;&quot;,  # how nested groups are specified
+                    &quot;memberIdAttr&quot;: &quot;apple-generateduid&quot;,  # which attribute the above refer to
</ins><span class="cx">                 },
</span><span class="cx">                 &quot;resourceSchema&quot;: {
</span><del>-                    &quot;resourceInfoAttr&quot;: &quot;apple-resource-info&quot;, # contains location/resource info
</del><ins>+                    &quot;resourceInfoAttr&quot;: &quot;apple-resource-info&quot;,  # contains location/resource info
</ins><span class="cx">                     &quot;autoScheduleAttr&quot;: None,
</span><span class="cx">                     &quot;proxyAttr&quot;: None,
</span><span class="cx">                     &quot;readOnlyProxyAttr&quot;: None,
</span><span class="cx">                     &quot;autoAcceptGroupAttr&quot;: None,
</span><span class="cx">                 },
</span><span class="cx">                 &quot;poddingSchema&quot;: {
</span><del>-                    &quot;serverIdAttr&quot;: &quot;server-id&quot;, # maps to augments server-id
</del><ins>+                    &quot;serverIdAttr&quot;: &quot;server-id&quot;,  # maps to augments server-id
</ins><span class="cx">                 },
</span><span class="cx">             }
</span><span class="cx">         )
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">         def setupService(self, scenario):
</span><span class="cx">             self.service = LdapDirectoryService(scenario[1])
</span><span class="cx">             self.service.ldap = LdapDirectoryTestWrapper(self.service.ldap, scenario[0])
</span><span class="lines">@@ -1286,11 +1314,14 @@
</span><span class="cx">                 'cn': ['Amanda Test']
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            record = self.service._ldapResultToRecord(dn, attrs,
-                self.service.recordType_users)
</del><ins>+            record = self.service._ldapResultToRecord(
+                dn, attrs, self.service.recordType_users
+            )
</ins><span class="cx">             self.assertEquals(record.guid, guid)
</span><del>-            self.assertEquals(record.emailAddresses,
-                set(['alternate@example.com', 'odtestamanda@example.com']))
</del><ins>+            self.assertEquals(
+                record.emailAddresses,
+                set(['alternate@example.com', 'odtestamanda@example.com'])
+            )
</ins><span class="cx">             self.assertEquals(record.shortNames, ('odtestamanda',))
</span><span class="cx">             self.assertEquals(record.fullName, 'Amanda Test')
</span><span class="cx">             self.assertEquals(record.firstName, 'Amanda')
</span><span class="lines">@@ -1312,8 +1343,9 @@
</span><span class="cx">                 'cn': ['Amanda Test']
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            record = self.service._ldapResultToRecord(dn, attrs,
-                self.service.recordType_users)
</del><ins>+            record = self.service._ldapResultToRecord(
+                dn, attrs, self.service.recordType_users
+            )
</ins><span class="cx">             self.assertTrue(record.enabledForCalendaring)
</span><span class="cx"> 
</span><span class="cx">             # User with &quot;podding&quot; info
</span><span class="lines">@@ -1324,11 +1356,12 @@
</span><span class="cx">                 'uid': ['odtestamanda'],
</span><span class="cx">                 'apple-generateduid': [guid],
</span><span class="cx">                 'cn': ['Amanda Test'],
</span><del>-                'server-id' : [&quot;test-server-id&quot;],
</del><ins>+                'server-id': [&quot;test-server-id&quot;],
</ins><span class="cx">             }
</span><span class="cx"> 
</span><del>-            record = self.service._ldapResultToRecord(dn, attrs,
-                self.service.recordType_users)
</del><ins>+            record = self.service._ldapResultToRecord(
+                dn, attrs, self.service.recordType_users
+            )
</ins><span class="cx">             self.assertEquals(record.serverID, &quot;test-server-id&quot;)
</span><span class="cx"> 
</span><span class="cx">             # User missing guidAttr
</span><span class="lines">@@ -1339,9 +1372,11 @@
</span><span class="cx">                 'cn': ['Amanda Test'],
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            self.assertRaises(MissingGuidException,
</del><ins>+            self.assertRaises(
+                MissingGuidException,
</ins><span class="cx">                 self.service._ldapResultToRecord, dn, attrs,
</span><del>-                self.service.recordType_users)
</del><ins>+                self.service.recordType_users
+            )
</ins><span class="cx"> 
</span><span class="cx">             # User missing record name
</span><span class="cx"> 
</span><span class="lines">@@ -1351,9 +1386,11 @@
</span><span class="cx">                 'cn': ['Amanda Test'],
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            self.assertRaises(MissingRecordNameException,
</del><ins>+            self.assertRaises(
+                MissingRecordNameException,
</ins><span class="cx">                 self.service._ldapResultToRecord, dn, attrs,
</span><del>-                self.service.recordType_users)
</del><ins>+                self.service.recordType_users
+            )
</ins><span class="cx"> 
</span><span class="cx">             # Group with direct user members and nested group
</span><span class="cx"> 
</span><span class="lines">@@ -1361,23 +1398,26 @@
</span><span class="cx">             guid = '6C6CD280-E6E3-11DF-9492-0800200C9A66'
</span><span class="cx">             attrs = {
</span><span class="cx">                 'apple-generateduid': [guid],
</span><del>-                'uniqueMember':
</del><ins>+                'uniqueMember': [
+                    'uid=odtestamanda,cn=users,dc=example,dc=com',
+                    'uid=odtestbetty,cn=users,dc=example,dc=com',
+                    'cn=odtestgroupb,cn=groups,dc=example,dc=com',
+                ],
+                'cn': ['odtestgrouptop']
+            }
+            record = self.service._ldapResultToRecord(
+                dn, attrs, self.service.recordType_groups
+            )
+            self.assertEquals(record.guid, guid)
+            self.assertEquals(
+                record.memberGUIDs(),
+                set(
</ins><span class="cx">                     [
</span><ins>+                        'cn=odtestgroupb,cn=groups,dc=example,dc=com',
</ins><span class="cx">                         'uid=odtestamanda,cn=users,dc=example,dc=com',
</span><span class="cx">                         'uid=odtestbetty,cn=users,dc=example,dc=com',
</span><del>-                        'cn=odtestgroupb,cn=groups,dc=example,dc=com',
-                    ],
-                'cn': ['odtestgrouptop']
-            }
-            record = self.service._ldapResultToRecord(dn, attrs,
-                self.service.recordType_groups)
-            self.assertEquals(record.guid, guid)
-            self.assertEquals(record.memberGUIDs(),
-                set([
-                     'cn=odtestgroupb,cn=groups,dc=example,dc=com',
-                     'uid=odtestamanda,cn=users,dc=example,dc=com',
-                     'uid=odtestbetty,cn=users,dc=example,dc=com',
-                     ])
</del><ins>+                    ]
+                )
</ins><span class="cx">             )
</span><span class="cx"> 
</span><span class="cx">             # Group with illegal DN value in members
</span><span class="lines">@@ -1386,22 +1426,25 @@
</span><span class="cx">             guid = '6C6CD280-E6E3-11DF-9492-0800200C9A66'
</span><span class="cx">             attrs = {
</span><span class="cx">                 'apple-generateduid': [guid],
</span><del>-                'uniqueMember':
-                    [
-                        'uid=odtestamanda,cn=users,dc=example,dc=com',
-                        'uid=odtestbetty ,cn=users,dc=example,dc=com',
-                        'cn=odtestgroupb+foo,cn=groups,dc=example,dc=com',
-                    ],
</del><ins>+                'uniqueMember': [
+                    'uid=odtestamanda,cn=users,dc=example,dc=com',
+                    'uid=odtestbetty ,cn=users,dc=example,dc=com',
+                    'cn=odtestgroupb+foo,cn=groups,dc=example,dc=com',
+                ],
</ins><span class="cx">                 'cn': ['odtestgrouptop']
</span><span class="cx">             }
</span><del>-            record = self.service._ldapResultToRecord(dn, attrs,
-                self.service.recordType_groups)
</del><ins>+            record = self.service._ldapResultToRecord(
+                dn, attrs, self.service.recordType_groups
+            )
</ins><span class="cx">             self.assertEquals(record.guid, guid)
</span><del>-            self.assertEquals(record.memberGUIDs(),
-                set([
-                     'uid=odtestamanda,cn=users,dc=example,dc=com',
-                     'uid=odtestbetty,cn=users,dc=example,dc=com',
-                     ])
</del><ins>+            self.assertEquals(
+                record.memberGUIDs(),
+                set(
+                    [
+                        'uid=odtestamanda,cn=users,dc=example,dc=com',
+                        'uid=odtestbetty,cn=users,dc=example,dc=com',
+                    ]
+                )
</ins><span class="cx">             )
</span><span class="cx"> 
</span><span class="cx">             # Resource with delegates, autoSchedule = True, and autoAcceptGroup
</span><span class="lines">@@ -1429,16 +1472,22 @@
</span><span class="cx"> &lt;/dict&gt;
</span><span class="cx"> &lt;/plist&gt;&quot;&quot;&quot;]
</span><span class="cx">             }
</span><del>-            record = self.service._ldapResultToRecord(dn, attrs,
-                self.service.recordType_resources)
</del><ins>+            record = self.service._ldapResultToRecord(
+                dn, attrs, self.service.recordType_resources
+            )
</ins><span class="cx">             self.assertEquals(record.guid, guid)
</span><del>-            self.assertEquals(record.externalProxies(),
-                set(['6C6CD280-E6E3-11DF-9492-0800200C9A66']))
-            self.assertEquals(record.externalReadOnlyProxies(),
-                set(['6AA1AE12-592F-4190-A069-547CD83C47C0']))
</del><ins>+            self.assertEquals(
+                record.externalProxies(),
+                set(['6C6CD280-E6E3-11DF-9492-0800200C9A66'])
+            )
+            self.assertEquals(
+                record.externalReadOnlyProxies(),
+                set(['6AA1AE12-592F-4190-A069-547CD83C47C0'])
+            )
</ins><span class="cx">             self.assertTrue(record.autoSchedule)
</span><del>-            self.assertEquals(record.autoAcceptGroup,
-                '77A8EB52-AA2A-42ED-8843-B2BEE863AC70')
</del><ins>+            self.assertEquals(
+                record.autoAcceptGroup, '77A8EB52-AA2A-42ED-8843-B2BEE863AC70'
+            )
</ins><span class="cx"> 
</span><span class="cx">             # Resource with no delegates and autoSchedule = False
</span><span class="cx"> 
</span><span class="lines">@@ -1459,25 +1508,24 @@
</span><span class="cx"> &lt;/dict&gt;
</span><span class="cx"> &lt;/plist&gt;&quot;&quot;&quot;]
</span><span class="cx">             }
</span><del>-            record = self.service._ldapResultToRecord(dn, attrs,
-                self.service.recordType_resources)
</del><ins>+            record = self.service._ldapResultToRecord(
+                dn, attrs, self.service.recordType_resources
+            )
</ins><span class="cx">             self.assertEquals(record.guid, guid)
</span><del>-            self.assertEquals(record.externalProxies(),
-                set())
-            self.assertEquals(record.externalReadOnlyProxies(),
-                set())
</del><ins>+            self.assertEquals(record.externalProxies(), set())
+            self.assertEquals(record.externalReadOnlyProxies(), set())
</ins><span class="cx">             self.assertFalse(record.autoSchedule)
</span><span class="cx">             self.assertEquals(record.autoAcceptGroup, &quot;&quot;)
</span><span class="cx"> 
</span><span class="cx">             # Now switch off the resourceInfoAttr and switch to individual
</span><span class="cx">             # attributes...
</span><span class="cx">             self.service.resourceSchema = {
</span><del>-                &quot;resourceInfoAttr&quot; : &quot;&quot;,
-                &quot;autoScheduleAttr&quot; : &quot;auto-schedule&quot;,
-                &quot;autoScheduleEnabledValue&quot; : &quot;yes&quot;,
-                &quot;proxyAttr&quot; : &quot;proxy&quot;,
-                &quot;readOnlyProxyAttr&quot; : &quot;read-only-proxy&quot;,
-                &quot;autoAcceptGroupAttr&quot; : &quot;auto-accept-group&quot;,
</del><ins>+                &quot;resourceInfoAttr&quot;: &quot;&quot;,
+                &quot;autoScheduleAttr&quot;: &quot;auto-schedule&quot;,
+                &quot;autoScheduleEnabledValue&quot;: &quot;yes&quot;,
+                &quot;proxyAttr&quot;: &quot;proxy&quot;,
+                &quot;readOnlyProxyAttr&quot;: &quot;read-only-proxy&quot;,
+                &quot;autoAcceptGroupAttr&quot;: &quot;auto-accept-group&quot;,
</ins><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             # Resource with delegates and autoSchedule = True
</span><span class="lines">@@ -1487,21 +1535,28 @@
</span><span class="cx">             attrs = {
</span><span class="cx">                 'apple-generateduid': [guid],
</span><span class="cx">                 'cn': ['odtestresource'],
</span><del>-                'auto-schedule' : ['yes'],
-                'proxy' : ['6C6CD280-E6E3-11DF-9492-0800200C9A66'],
-                'read-only-proxy' : ['6AA1AE12-592F-4190-A069-547CD83C47C0'],
-                'auto-accept-group' : ['77A8EB52-AA2A-42ED-8843-B2BEE863AC70'],
</del><ins>+                'auto-schedule': ['yes'],
+                'proxy': ['6C6CD280-E6E3-11DF-9492-0800200C9A66'],
+                'read-only-proxy': ['6AA1AE12-592F-4190-A069-547CD83C47C0'],
+                'auto-accept-group': ['77A8EB52-AA2A-42ED-8843-B2BEE863AC70'],
</ins><span class="cx">             }
</span><del>-            record = self.service._ldapResultToRecord(dn, attrs,
-                self.service.recordType_resources)
</del><ins>+            record = self.service._ldapResultToRecord(
+                dn, attrs, self.service.recordType_resources
+            )
</ins><span class="cx">             self.assertEquals(record.guid, guid)
</span><del>-            self.assertEquals(record.externalProxies(),
-                set(['6C6CD280-E6E3-11DF-9492-0800200C9A66']))
-            self.assertEquals(record.externalReadOnlyProxies(),
-                set(['6AA1AE12-592F-4190-A069-547CD83C47C0']))
</del><ins>+            self.assertEquals(
+                record.externalProxies(),
+                set(['6C6CD280-E6E3-11DF-9492-0800200C9A66'])
+            )
+            self.assertEquals(
+                record.externalReadOnlyProxies(),
+                set(['6AA1AE12-592F-4190-A069-547CD83C47C0'])
+            )
</ins><span class="cx">             self.assertTrue(record.autoSchedule)
</span><del>-            self.assertEquals(record.autoAcceptGroup,
-                '77A8EB52-AA2A-42ED-8843-B2BEE863AC70')
</del><ins>+            self.assertEquals(
+                record.autoAcceptGroup,
+                '77A8EB52-AA2A-42ED-8843-B2BEE863AC70'
+            )
</ins><span class="cx"> 
</span><span class="cx">             # Record with lowercase guid
</span><span class="cx">             dn = &quot;uid=odtestamanda,cn=users,dc=example,dc=com&quot;
</span><span class="lines">@@ -1514,8 +1569,9 @@
</span><span class="cx">                 'givenName': ['Amanda'],
</span><span class="cx">                 'cn': ['Amanda Test']
</span><span class="cx">             }
</span><del>-            record = self.service._ldapResultToRecord(dn, attrs,
-                self.service.recordType_users)
</del><ins>+            record = self.service._ldapResultToRecord(
+                dn, attrs, self.service.recordType_users
+            )
</ins><span class="cx">             self.assertEquals(record.guid, guid.upper())
</span><span class="cx"> 
</span><span class="cx">             # Location with associated Address
</span><span class="lines">@@ -1525,14 +1581,15 @@
</span><span class="cx">             attrs = {
</span><span class="cx">                 &quot;apple-generateduid&quot;: [guid],
</span><span class="cx">                 &quot;cn&quot;: [&quot;odtestlocation&quot;],
</span><del>-                &quot;assocAddr&quot; : [&quot;6C6CD280-E6E3-11DF-9492-0800200C9A66&quot;],
</del><ins>+                &quot;assocAddr&quot;: [&quot;6C6CD280-E6E3-11DF-9492-0800200C9A66&quot;],
</ins><span class="cx">             }
</span><del>-            record = self.service._ldapResultToRecord(dn, attrs,
-                self.service.recordType_locations)
</del><ins>+            record = self.service._ldapResultToRecord(
+                dn, attrs, self.service.recordType_locations
+            )
</ins><span class="cx">             self.assertEquals(record.extras, {
</span><span class="cx">                 &quot;associatedAddress&quot;: &quot;6C6CD280-E6E3-11DF-9492-0800200C9A66&quot;
</span><span class="cx">             })
</span><del>-           
</del><ins>+
</ins><span class="cx">             # Address with street and geo
</span><span class="cx"> 
</span><span class="cx">             dn = &quot;cn=odtestaddress,cn=buildings,dc=example,dc=com&quot;
</span><span class="lines">@@ -1540,16 +1597,16 @@
</span><span class="cx">             attrs = {
</span><span class="cx">                 &quot;apple-generateduid&quot;: [guid],
</span><span class="cx">                 &quot;cn&quot;: [&quot;odtestaddress&quot;],
</span><del>-                &quot;coordinates&quot; : [&quot;geo:1,2&quot;],
-                &quot;postal&quot; : [&quot;1 Infinite Loop, Cupertino, CA&quot;],
</del><ins>+                &quot;coordinates&quot;: [&quot;geo:1,2&quot;],
+                &quot;postal&quot;: [&quot;1 Infinite Loop, Cupertino, CA&quot;],
</ins><span class="cx">             }
</span><del>-            record = self.service._ldapResultToRecord(dn, attrs,
-                self.service.recordType_addresses)
</del><ins>+            record = self.service._ldapResultToRecord(
+                dn, attrs, self.service.recordType_addresses
+            )
</ins><span class="cx">             self.assertEquals(record.extras, {
</span><span class="cx">                 &quot;geo&quot;: &quot;geo:1,2&quot;,
</span><del>-                &quot;streetAddress&quot; : &quot;1 Infinite Loop, Cupertino, CA&quot;,
</del><ins>+                &quot;streetAddress&quot;: &quot;1 Infinite Loop, Cupertino, CA&quot;,
</ins><span class="cx">             })
</span><del>-           
</del><span class="cx"> 
</span><span class="cx">         def test_listRecords(self):
</span><span class="cx">             &quot;&quot;&quot;
</span><span class="lines">@@ -1562,7 +1619,7 @@
</span><span class="cx">             self.assertEquals(len(records), 4)
</span><span class="cx">             self.assertEquals(
</span><span class="cx">                 set([r.firstName for r in records]),
</span><del>-                set([&quot;Amanda&quot;, &quot;Betty&quot;, &quot;Cyrus&quot;, &quot;Wilfredo&quot;]) # Carlene is skipped because no guid in LDAP
</del><ins>+                set([&quot;Amanda&quot;, &quot;Betty&quot;, &quot;Cyrus&quot;, &quot;Wilfredo&quot;])  # Carlene is skipped because no guid in LDAP
</ins><span class="cx">             )
</span><span class="cx"> 
</span><span class="cx">         def test_restrictedPrincipalsUsingDN(self):
</span><span class="lines">@@ -1574,18 +1631,20 @@
</span><span class="cx">             for scenario in (
</span><span class="cx">                 self.nestedUsingSameAttributeUsingDN,
</span><span class="cx">                 self.nestedUsingDifferentAttributeUsingDN,
</span><del>-                ):
</del><ins>+            ):
</ins><span class="cx">                 self.setupService(scenario)
</span><span class="cx"> 
</span><span class="cx">                 self.assertEquals(
</span><del>-                    set([
-                        &quot;cn=left_coast,cn=groups,dc=example,dc=com&quot;,
-                        &quot;cn=right_coast,cn=groups,dc=example,dc=com&quot;,
-                        &quot;uid=cdaboo,cn=users,dc=example,dc=com&quot;,
-                        &quot;uid=dreid,cn=users,dc=example,dc=com&quot;,
-                        &quot;uid=lecroy,cn=users,dc=example,dc=com&quot;,
-                        &quot;uid=wsanchez,cn=users,dc=example,dc=com&quot;,
-                    ]),
</del><ins>+                    set(
+                        [
+                            &quot;cn=left_coast,cn=groups,dc=example,dc=com&quot;,
+                            &quot;cn=right_coast,cn=groups,dc=example,dc=com&quot;,
+                            &quot;uid=cdaboo,cn=users,dc=example,dc=com&quot;,
+                            &quot;uid=dreid,cn=users,dc=example,dc=com&quot;,
+                            &quot;uid=lecroy,cn=users,dc=example,dc=com&quot;,
+                            &quot;uid=wsanchez,cn=users,dc=example,dc=com&quot;,
+                        ]
+                    ),
</ins><span class="cx">                     self.service.restrictedPrincipals)
</span><span class="cx"> 
</span><span class="cx">                 dn = &quot;uid=cdaboo,cn=users,dc=example,dc=com&quot;
</span><span class="lines">@@ -1620,16 +1679,18 @@
</span><span class="cx">             for scenario in (
</span><span class="cx">                 self.nestedUsingDifferentAttributeUsingGUID,
</span><span class="cx">                 self.nestedUsingSameAttributeUsingGUID,
</span><del>-                ):
</del><ins>+            ):
</ins><span class="cx">                 self.setupService(scenario)
</span><span class="cx"> 
</span><span class="cx">                 self.assertEquals(
</span><del>-                    set([
-                        &quot;left_coast&quot;,
-                        &quot;right_coast&quot;,
-                        &quot;5A985493-EE2C-4665-94CF-4DFEA3A89500&quot;,
-                        &quot;6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;,
-                    ]),
</del><ins>+                    set(
+                        [
+                            &quot;left_coast&quot;,
+                            &quot;right_coast&quot;,
+                            &quot;5A985493-EE2C-4665-94CF-4DFEA3A89500&quot;,
+                            &quot;6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;,
+                        ]
+                    ),
</ins><span class="cx">                     self.service.restrictedPrincipals)
</span><span class="cx"> 
</span><span class="cx">                 dn = &quot;uid=cdaboo,cn=users,dc=example,dc=com&quot;
</span><span class="lines">@@ -1674,8 +1735,10 @@
</span><span class="cx">             # Set up the GroupMembershipCache
</span><span class="cx">             cache = GroupMembershipCache(&quot;ProxyDB&quot;, expireSeconds=60)
</span><span class="cx">             self.service.groupMembershipCache = cache
</span><del>-            updater = GroupMembershipCacheUpdater(calendaruserproxy.ProxyDBService,
-                self.service, 30, 15, 30, cache=cache, useExternalProxies=False)
</del><ins>+            updater = GroupMembershipCacheUpdater(
+                calendaruserproxy.ProxyDBService,
+                self.service, 30, 15, 30, cache=cache, useExternalProxies=False
+            )
</ins><span class="cx"> 
</span><span class="cx">             self.assertEquals((False, 8, 8), (yield updater.updateCache()))
</span><span class="cx"> 
</span><span class="lines">@@ -1708,21 +1771,24 @@
</span><span class="cx">                 ]
</span><span class="cx">             )
</span><span class="cx"> 
</span><del>-
</del><span class="cx">         def test_splitIntoBatches(self):
</span><span class="cx">             self.setupService(self.nestedUsingDifferentAttributeUsingDN)
</span><span class="cx">             # Data is perfect multiple of size
</span><span class="cx">             results = list(splitIntoBatches(set(range(12)), 4))
</span><del>-            self.assertEquals(results,
-                [set([0, 1, 2, 3]), set([4, 5, 6, 7]), set([8, 9, 10, 11])])
</del><ins>+            self.assertEquals(
+                results,
+                [set([0, 1, 2, 3]), set([4, 5, 6, 7]), set([8, 9, 10, 11])]
+            )
</ins><span class="cx"> 
</span><span class="cx">             # Some left overs
</span><span class="cx">             results = list(splitIntoBatches(set(range(12)), 5))
</span><del>-            self.assertEquals(results,
-                [set([0, 1, 2, 3, 4]), set([8, 9, 5, 6, 7]), set([10, 11])])
</del><ins>+            self.assertEquals(
+                results,
+                [set([0, 1, 2, 3, 4]), set([8, 9, 5, 6, 7]), set([10, 11])]
+            )
</ins><span class="cx"> 
</span><span class="cx">             # Empty
</span><del>-            results = list(splitIntoBatches(set([]), 5)) # empty data
</del><ins>+            results = list(splitIntoBatches(set([]), 5))  # empty data
</ins><span class="cx">             self.assertEquals(results, [set([])])
</span><span class="cx"> 
</span><span class="cx">         def test_recordTypeForDN(self):
</span><span class="lines">@@ -1772,7 +1838,8 @@
</span><span class="cx">             self.history = []
</span><span class="cx"> 
</span><span class="cx">             def stubSearchMethod(base, scope, filterstr=&quot;(objectClass=*)&quot;,
</span><del>-                attrlist=None, timeoutSeconds=-1, resultLimit=0):
</del><ins>+                                 attrlist=None, timeoutSeconds=-1,
+                                 resultLimit=0):
</ins><span class="cx">                 self.history.append((base, scope, filterstr))
</span><span class="cx"> 
</span><span class="cx">             recordTypes = [
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_livedirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_livedirectory.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_livedirectory.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_livedirectory.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_modifypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_modify.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_modify.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_modify.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_opendirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_opendirectory.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_opendirectory.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_opendirectory.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_opendirectorybackerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_opendirectorybacker.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_opendirectorybacker.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_opendirectorybacker.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_principalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_principal.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_principal.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_principal.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_proxyprincipaldbpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_proxyprincipaldb.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_proxyprincipaldb.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_proxyprincipaldb.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_proxyprincipalmemberspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_proxyprincipalmembers.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_proxyprincipalmembers.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_proxyprincipalmembers.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_resourcespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_resources.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_resources.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_resources.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_utilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_wikipy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_wiki.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_wiki.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_wiki.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytesttest_xmlfilepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_xmlfile.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_xmlfile.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/test_xmlfile.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorytestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/test/util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.directory.test.test_util -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorywikipy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/wiki.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/wiki.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/wiki.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryxmlaccountsparserpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/xmlaccountsparser.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/xmlaccountsparser.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/xmlaccountsparser.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryxmlaugmentsparserpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/xmlaugmentsparser.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/xmlaugmentsparser.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/xmlaugmentsparser.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectoryxmlfilepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/xmlfile.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/xmlfile.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directory/xmlfile.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdirectorybackedaddressbookpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directorybackedaddressbook.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directorybackedaddressbook.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/directorybackedaddressbook.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavdropboxpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/dropbox.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/dropbox.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/dropbox.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavextensionspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/extensions.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/extensions.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/extensions.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.test.test_extensions -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavfreebusyurlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/freebusyurl.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/freebusyurl.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/freebusyurl.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavicalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/ical.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/ical.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/ical.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.test.test_icalendar -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -1213,34 +1213,42 @@
</span><span class="cx">         if master:
</span><span class="cx">             # Check if cut-off matches an RDATE
</span><span class="cx">             adjusted_rid = rid
</span><ins>+            adjust_rrule = None
+            adjust_count = 0
</ins><span class="cx">             continuing_rrule = True
</span><del>-            rdates = set([v.getValue() for v in itertools.chain(*[rdate.value() for rdate in master.properties(&quot;RDATE&quot;)])])
-            if rid in rdates:
-                # Need to detect the first valid RRULE instance after the cut-off
-                rrules = master._pycalendar.getRecurrenceSet()
-                if rrules and len(rrules.getRules()) != 0:
-                    rrule = rrules.getRules()[0]
-                    upperlimit = rid.duplicate()
-                    upperlimit.offsetYear(1)
-                    rrule_expanded = []
-                    rrule.expand(
-                        master.propertyValue(&quot;DTSTART&quot;),
-                        Period(DateTime(1900, 1, 1), upperlimit),
-                        rrule_expanded,
-                    )
-                    for i in sorted(rrule_expanded):
-                        if i &gt; rid:
-                            adjusted_rid = i
-                            break
-                    else:
-                        # RRULE not needed in derived master
-                        continuing_rrule = False
</del><span class="cx"> 
</span><ins>+            # Need to detect the first valid RRULE instance after the cut-off as that needs to be the new DTSTART
+            rrules = master._pycalendar.getRecurrenceSet()
+            if rrules and len(rrules.getRules()) != 0:
+                rrule = rrules.getRules()[0]
+                upperlimit = rid.duplicate()
+                upperlimit.offsetYear(1)
+                rrule_expanded = []
+                rrule.expand(
+                    master.propertyValue(&quot;DTSTART&quot;),
+                    Period(DateTime(1900, 1, 1), upperlimit),
+                    rrule_expanded,
+                )
+                for ctr, i in enumerate(sorted(rrule_expanded)):
+                    if i &gt;= rid:
+                        adjusted_rid = i
+                        adjust_rrule = rrule
+                        adjust_count = ctr
+                        break
+                else:
+                    # RRULE not needed in derived master
+                    continuing_rrule = False
+
</ins><span class="cx">             # Adjust master to previously derived instance
</span><span class="cx">             derived = self.deriveInstance(adjusted_rid, allowExcluded=True)
</span><span class="cx">             if derived is None:
</span><span class="cx">                 return
</span><span class="cx"> 
</span><ins>+            # Adjust any COUNT to exclude the earlier instances - note we do this after
+            # deriving the instance otherwise it might truncate the instance we care about
+            if adjust_rrule is not None and rrule.getUseCount():
+                adjust_rrule.setCount(adjust_rrule.getCount() - adjust_count)
+
</ins><span class="cx">             # Fix up recurrence properties so the derived one looks like the master
</span><span class="cx">             derived.removeProperty(derived.getProperty(&quot;RECURRENCE-ID&quot;))
</span><span class="cx">             for property in list(itertools.chain(
</span><span class="lines">@@ -3645,7 +3653,7 @@
</span><span class="cx">     icalstr = str(icalstr).replace(&quot;\r\n &quot;, &quot;&quot;)
</span><span class="cx">     icalstr = icalstr.replace(&quot;\n &quot;, &quot;&quot;)
</span><span class="cx">     icalstr = &quot;\r\n&quot;.join([line for line in icalstr.splitlines() if not line.startswith(&quot;DTSTAMP&quot;)])
</span><del>-    return icalstr
</del><ins>+    return icalstr + &quot;\r\n&quot;
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavicaldavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/icaldav.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/icaldav.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/icaldav.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavinstancepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/instance.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/instance.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/instance.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavlinkresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/linkresource.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/linkresource.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/linkresource.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavlocalizationpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/localization.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/localization.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/localization.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmemcachelockpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/memcachelock.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/memcachelock.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/memcachelock.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmemcachepoolpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/memcachepool.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/memcachepool.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/memcachepool.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmemcachepropspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/memcacheprops.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/memcacheprops.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/memcacheprops.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmemcacherpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/memcacher.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/memcacher.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/memcacher.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethod__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodaclpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/acl.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/acl.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/acl.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodgetpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/get.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/get.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/get.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodmkcalendarpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/mkcalendar.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/mkcalendar.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/mkcalendar.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodmkcolpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/mkcol.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/mkcol.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/mkcol.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.test.test_DAV.MKCOL -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodpostpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/post.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/post.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/post.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> # #
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -22,7 +22,6 @@
</span><span class="cx"> __all__ = [&quot;http_POST&quot;]
</span><span class="cx"> 
</span><span class="cx"> from txweb2 import responsecode
</span><del>-from txweb2.http import StatusResponse
</del><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> 
</span><span class="lines">@@ -45,13 +44,9 @@
</span><span class="cx">         action = request.args.get(&quot;action&quot;, (&quot;&quot;,))
</span><span class="cx">         if len(action) == 1:
</span><span class="cx">             action = action[0]
</span><del>-            if action in (&quot;attachment-add&quot;, &quot;attachment-update&quot;, &quot;attachment-remove&quot;) and \
-                hasattr(self, &quot;POST_handler_attachment&quot;):
-                if config.EnableManagedAttachments:
-                    result = (yield self.POST_handler_attachment(request, action))
-                    returnValue(result)
-                else:
-                    returnValue(StatusResponse(responsecode.FORBIDDEN, &quot;Managed Attachments not supported.&quot;))
</del><ins>+            if hasattr(self, &quot;POST_handler_action&quot;):
+                result = (yield self.POST_handler_action(request, action))
+                returnValue(result)
</ins><span class="cx"> 
</span><span class="cx">     # Content-type handlers
</span><span class="cx">     contentType = request.headers.getHeader(&quot;content-type&quot;)
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodpropfindpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/propfind.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/propfind.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/propfind.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_prop.PROP.test_PROPFIND -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodreportpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodreport_addressbook_multigetpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_addressbook_multiget.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_addressbook_multiget.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_addressbook_multiget.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodreport_addressbook_querypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_addressbook_query.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_addressbook_query.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_addressbook_query.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.test.test_addressbookquery -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -27,7 +27,6 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from txweb2 import responsecode
</span><del>-from txdav.xml import element as davxml
</del><span class="cx"> from txweb2.dav.http import ErrorResponse, MultiStatusResponse
</span><span class="cx"> from txweb2.dav.method.report import NumberOfMatchesWithinLimits
</span><span class="cx"> from txweb2.dav.util import joinURL
</span><span class="lines">@@ -37,9 +36,11 @@
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twistedcaldav.carddavxml import carddav_namespace, NResults
</span><span class="cx"> from twistedcaldav.method import report_common
</span><del>-from twistedcaldav.query import addressbookqueryfilter
</del><span class="cx"> 
</span><del>-from txdav.common.icommondatastore import ConcurrentModification
</del><ins>+from txdav.carddav.datastore.query.filter import Filter
+from txdav.common.icommondatastore import ConcurrentModification, \
+    IndexedSearchException
+from txdav.xml import element as davxml
</ins><span class="cx"> 
</span><span class="cx"> log = Logger()
</span><span class="cx"> 
</span><span class="lines">@@ -62,7 +63,7 @@
</span><span class="cx">     responses = []
</span><span class="cx"> 
</span><span class="cx">     xmlfilter = addressbook_query.filter
</span><del>-    filter = addressbookqueryfilter.Filter(xmlfilter)
</del><ins>+    filter = Filter(xmlfilter)
</ins><span class="cx">     query = addressbook_query.props
</span><span class="cx">     limit = addressbook_query.limit
</span><span class="cx"> 
</span><span class="lines">@@ -209,7 +210,7 @@
</span><span class="cx">                                                         carddavxml.TextMatch.fromString(resource_name[:-4]),
</span><span class="cx">                                                         name=&quot;UID&quot;, # attributes
</span><span class="cx">                                                         ), ])
</span><del>-                            vCardFilter = addressbookqueryfilter.Filter(vCardFilter)
</del><ins>+                            vCardFilter = Filter(vCardFilter)
</ins><span class="cx"> 
</span><span class="cx">                             directoryAddressBookLock, limited[0] = (yield  directory.cacheVCardsForAddressBookQuery(vCardFilter, query, max_number_of_results[0]))
</span><span class="cx"> 
</span><span class="lines">@@ -230,11 +231,13 @@
</span><span class="cx"> 
</span><span class="cx">                     # Check for disabled access
</span><span class="cx">                     if filteredaces is not None:
</span><del>-                        # See whether the filter is valid for an index only query
-                        index_query_ok = addrresource.index().searchValid(filter)
-
-                        # Get list of children that match the search and have read access
-                        names = [name for name, ignore_uid in (yield addrresource.index().search(filter))] #@UnusedVariable
</del><ins>+                        index_query_ok = True
+                        try:
+                            # Get list of children that match the search and have read access
+                            names = [name for name, ignore_uid in (yield addrresource.search(filter))] #@UnusedVariable
+                        except IndexedSearchException:
+                            names = yield addrresource.listChildren()
+                            index_query_ok = False
</ins><span class="cx">                         if not names:
</span><span class="cx">                             return
</span><span class="cx"> 
</span><span class="lines">@@ -277,7 +280,7 @@
</span><span class="cx">                                                     carddavxml.TextMatch.fromString(resource_name[:-4]),
</span><span class="cx">                                                     name=&quot;UID&quot;, # attributes
</span><span class="cx">                                                     ), ])
</span><del>-                        vCardFilter = addressbookqueryfilter.Filter(vCardFilter)
</del><ins>+                        vCardFilter = Filter(vCardFilter)
</ins><span class="cx"> 
</span><span class="cx">                         yield  maybeDeferred(queryDirectoryBackedAddressBook, parent, vCardFilter)
</span><span class="cx">                         handled = True
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodreport_calendar_multigetpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_calendar_multiget.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_calendar_multiget.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_calendar_multiget.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodreport_calendar_querypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_calendar_query.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_calendar_query.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_calendar_query.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -20,8 +20,7 @@
</span><span class="cx"> 
</span><span class="cx"> __all__ = [&quot;report_urn_ietf_params_xml_ns_caldav_calendar_query&quot;]
</span><span class="cx"> 
</span><del>-from twisted.internet.defer import inlineCallbacks, returnValue, \
-    maybeDeferred
</del><ins>+from twisted.internet.defer import inlineCallbacks, returnValue
</ins><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from txweb2 import responsecode
</span><span class="lines">@@ -39,8 +38,8 @@
</span><span class="cx">     ConcurrentModification
</span><span class="cx"> from twistedcaldav.instance import TooManyInstancesError
</span><span class="cx"> from twistedcaldav.method import report_common
</span><del>-from twistedcaldav.query import calendarqueryfilter
</del><span class="cx"> 
</span><ins>+from txdav.caldav.datastore.query.filter import Filter
</ins><span class="cx"> from txdav.caldav.icalendarstore import TimeRangeLowerLimit, TimeRangeUpperLimit
</span><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> 
</span><span class="lines">@@ -66,7 +65,7 @@
</span><span class="cx">     responses = []
</span><span class="cx"> 
</span><span class="cx">     xmlfilter = calendar_query.filter
</span><del>-    filter = calendarqueryfilter.Filter(xmlfilter)
</del><ins>+    filter = Filter(xmlfilter)
</ins><span class="cx">     props = calendar_query.props
</span><span class="cx"> 
</span><span class="cx">     assert props is not None
</span><span class="lines">@@ -190,13 +189,11 @@
</span><span class="cx">             if filteredaces is not None:
</span><span class="cx">                 index_query_ok = True
</span><span class="cx">                 try:
</span><del>-                    # Get list of children that match the search and have read
-                    # access
-                    records = yield maybeDeferred(calresource.index().indexedSearch, filter)
</del><ins>+                    # Get list of children that match the search and have read access
+                    names = [name for name, ignore_uid, ignore_type in (yield calresource.search(filter))]
</ins><span class="cx">                 except IndexedSearchException:
</span><del>-                    records = yield maybeDeferred(calresource.index().bruteForceSearch)
</del><ins>+                    names = yield calresource.listChildren()
</ins><span class="cx">                     index_query_ok = False
</span><del>-                names = [name for name, ignore_uid, ignore_type in records]
</del><span class="cx"> 
</span><span class="cx">                 if not names:
</span><span class="cx">                     returnValue(True)
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodreport_commonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_common.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_common.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_common.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -36,17 +36,16 @@
</span><span class="cx"> except ImportError:
</span><span class="cx">     from md5 import new as md5
</span><span class="cx"> 
</span><del>-from twisted.internet.defer import inlineCallbacks, returnValue, maybeDeferred
</del><ins>+from twisted.internet.defer import inlineCallbacks, returnValue
</ins><span class="cx"> from twisted.python.failure import Failure
</span><ins>+
</ins><span class="cx"> from txweb2 import responsecode
</span><del>-
-from txdav.xml import element
</del><span class="cx"> from txweb2.dav.http import statusForFailure
</span><span class="cx"> from txweb2.dav.method.propfind import propertyName
</span><span class="cx"> from txweb2.dav.method.report import NumberOfMatchesWithinLimits
</span><span class="cx"> from txweb2.dav.method.report import max_number_of_matches
</span><span class="cx"> from txweb2.dav.resource import AccessDeniedError
</span><del>-from txweb2.http import HTTPError
</del><ins>+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> 
</span><span class="lines">@@ -65,9 +64,9 @@
</span><span class="cx"> from twistedcaldav.instance import InstanceList
</span><span class="cx"> from twistedcaldav.memcacher import Memcacher
</span><span class="cx"> 
</span><del>-from twistedcaldav.query import calendarqueryfilter
-
</del><ins>+from txdav.caldav.datastore.query.filter import Filter
</ins><span class="cx"> from txdav.common.icommondatastore import IndexedSearchException
</span><ins>+from txdav.xml import element
</ins><span class="cx"> 
</span><span class="cx"> from pycalendar.duration import Duration
</span><span class="cx"> from pycalendar.datetime import DateTime
</span><span class="lines">@@ -583,17 +582,18 @@
</span><span class="cx">                           name=&quot;VCALENDAR&quot;,
</span><span class="cx">                        )
</span><span class="cx">                   )
</span><del>-        filter = calendarqueryfilter.Filter(filter)
</del><ins>+        filter = Filter(filter)
</ins><span class="cx">         tzinfo = filter.settimezone(tz)
</span><span class="cx"> 
</span><span class="cx">         try:
</span><del>-            resources = yield maybeDeferred(calresource.index().indexedSearch,
-                filter, useruid=useruid, fbtype=True
-            )
</del><ins>+            resources = yield calresource.search(filter, useruid=useruid, fbtype=True)
</ins><span class="cx">             if caching:
</span><span class="cx">                 yield FBCacheEntry.makeCacheEntry(calresource, useruid, cache_timerange, resources)
</span><span class="cx">         except IndexedSearchException:
</span><del>-            resources = yield maybeDeferred(calresource.index().bruteForceSearch)
</del><ins>+            raise HTTPError(StatusResponse(
+                responsecode.INTERNAL_SERVER_ERROR,
+                &quot;Failed freebusy query&quot;
+            ))
</ins><span class="cx"> 
</span><span class="cx">     else:
</span><span class="cx">         # Log extended item
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodreport_freebusypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_freebusy.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_freebusy.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_freebusy.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodreport_multiget_commonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_multiget_common.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_multiget_common.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_multiget_common.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -23,9 +23,8 @@
</span><span class="cx"> from urllib import unquote
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><ins>+
</ins><span class="cx"> from txweb2 import responsecode
</span><del>-from txdav.xml import element as davxml
-from txdav.xml.base import dav_namespace
</del><span class="cx"> from txweb2.dav.http import ErrorResponse, MultiStatusResponse
</span><span class="cx"> from txweb2.dav.resource import AccessDeniedError
</span><span class="cx"> from txweb2.http import HTTPError, StatusResponse
</span><span class="lines">@@ -37,11 +36,14 @@
</span><span class="cx"> from twistedcaldav.carddavxml import carddav_namespace
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twistedcaldav.method import report_common
</span><del>-from txdav.common.icommondatastore import ConcurrentModification
</del><span class="cx"> from twistedcaldav.method.report_common import COLLECTION_TYPE_CALENDAR, \
</span><span class="cx">     COLLECTION_TYPE_ADDRESSBOOK
</span><del>-from twistedcaldav.query import addressbookqueryfilter
</del><span class="cx"> 
</span><ins>+from txdav.carddav.datastore.query.filter import Filter
+from txdav.common.icommondatastore import ConcurrentModification
+from txdav.xml import element as davxml
+from txdav.xml.base import dav_namespace
+
</ins><span class="cx"> log = Logger()
</span><span class="cx"> 
</span><span class="cx"> @inlineCallbacks
</span><span class="lines">@@ -265,7 +267,7 @@
</span><span class="cx">                     returnValue(None)
</span><span class="cx"> 
</span><span class="cx">                 addressBookFilter = carddavxml.Filter(*vCardFilters)
</span><del>-                addressBookFilter = addressbookqueryfilter.Filter(addressBookFilter)
</del><ins>+                addressBookFilter = Filter(addressBookFilter)
</ins><span class="cx">                 if self.directory.cacheQuery:
</span><span class="cx">                     # add vcards to directory address book and run &quot;normal case&quot; below
</span><span class="cx">                     limit = config.DirectoryAddressBook.MaxQueryResults
</span><span class="lines">@@ -333,11 +335,11 @@
</span><span class="cx">                     parent = (yield child.locateParent(request, resource_uri))
</span><span class="cx"> 
</span><span class="cx">                     if collection_type == COLLECTION_TYPE_CALENDAR:
</span><del>-                        if not parent.isCalendarCollection() or not (yield parent.index().resourceExists(name)):
</del><ins>+                        if not parent.isCalendarCollection() or not (yield parent.resourceExists(name)):
</ins><span class="cx">                             responses.append(davxml.StatusResponse(href, davxml.Status.fromResponseCode(responsecode.FORBIDDEN)))
</span><span class="cx">                             continue
</span><span class="cx">                     elif collection_type == COLLECTION_TYPE_ADDRESSBOOK:
</span><del>-                        if not parent.isAddressBookCollection() or not (yield parent.index().resourceExists(name)):
</del><ins>+                        if not parent.isAddressBookCollection() or not (yield parent.resourceExists(name)):
</ins><span class="cx">                             responses.append(davxml.StatusResponse(href, davxml.Status.fromResponseCode(responsecode.FORBIDDEN)))
</span><span class="cx">                             continue
</span><span class="cx"> 
</span><span class="lines">@@ -367,11 +369,11 @@
</span><span class="cx">                     parent = (yield self.locateParent(request, resource_uri))
</span><span class="cx"> 
</span><span class="cx">                     if collection_type == COLLECTION_TYPE_CALENDAR:
</span><del>-                        if not parent.isPseudoCalendarCollection() or not (yield parent.index().resourceExists(name)):
</del><ins>+                        if not parent.isPseudoCalendarCollection() or not (yield parent.resourceExists(name)):
</ins><span class="cx">                             responses.append(davxml.StatusResponse(href, davxml.Status.fromResponseCode(responsecode.FORBIDDEN)))
</span><span class="cx">                             continue
</span><span class="cx">                     elif collection_type == COLLECTION_TYPE_ADDRESSBOOK:
</span><del>-                        if not parent.isAddressBookCollection() or not (yield parent.index().resourceExists(name)):
</del><ins>+                        if not parent.isAddressBookCollection() or not (yield parent.resourceExists(name)):
</ins><span class="cx">                             responses.append(davxml.StatusResponse(href, davxml.Status.fromResponseCode(responsecode.FORBIDDEN)))
</span><span class="cx">                             continue
</span><span class="cx">                     child = self
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmethodreport_sync_collectionpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_sync_collection.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_sync_collection.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/method/report_sync_collection.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavmkcolxmlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/mkcolxml.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/mkcolxml.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/mkcolxml.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavnotificationspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/notifications.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/notifications.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/notifications.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/resource.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/resource.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/resource.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.test.test_resource,twistedcaldav.test.test_wrapping -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -2667,10 +2667,9 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _indexWhatChanged(self, revision, depth):
</span><span class="cx">         # The newstore implementation supports this directly
</span><del>-        changed, deleted = yield self._newStoreHome.resourceNamesSinceToken(
</del><ins>+        changed, deleted, notallowed = yield self._newStoreHome.resourceNamesSinceToken(
</ins><span class="cx">             revision, depth
</span><span class="cx">         )
</span><del>-        notallowed = []
</del><span class="cx"> 
</span><span class="cx">         # Need to insert some addition items on first sync
</span><span class="cx">         if revision == 0:
</span><span class="lines">@@ -2894,10 +2893,9 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _indexWhatChanged(self, revision, depth):
</span><span class="cx">         # The newstore implementation supports this directly
</span><del>-        changed, deleted = yield self._newStoreHome.resourceNamesSinceToken(
</del><ins>+        changed, deleted, notallowed = yield self._newStoreHome.resourceNamesSinceToken(
</ins><span class="cx">             revision, depth
</span><span class="cx">         )
</span><del>-        notallowed = []
</del><span class="cx"> 
</span><span class="cx">         # Need to insert some addition items on first sync
</span><span class="cx">         if revision == 0:
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavscheduling_store__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavscheduling_storecaldav__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/caldav/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/caldav/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/caldav/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavscheduling_storecaldavresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/caldav/resource.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/caldav/resource.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/caldav/resource.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.directory.test.test_calendar -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavscheduling_storecaldavtest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/caldav/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/caldav/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/caldav/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavscheduling_storecaldavtesttest_resourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/caldav/test/test_resource.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/caldav/test/test_resource.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/scheduling_store/caldav/test/test_resource.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavsharingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/sharing.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/sharing.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/sharing.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.test.test_sharing -*-
</span><span class="cx"> # #
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -267,10 +267,10 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         if self._newStoreObject.direct():
</span><span class="cx">             owner = self.principalForUID(self._newStoreObject.ownerHome().uid())
</span><ins>+            sharee = self.principalForUID(self._newStoreObject.viewerHome().uid())
</ins><span class="cx">             if owner.record.recordType == WikiDirectoryService.recordType_wikis:
</span><span class="cx">                 # Access level comes from what the wiki has granted to the
</span><span class="cx">                 # sharee
</span><del>-                sharee = self.principalForUID(self._newStoreObject.viewerHome().uid())
</del><span class="cx">                 userID = sharee.record.guid
</span><span class="cx">                 wikiID = owner.record.shortNames[0]
</span><span class="cx">                 access = (yield getWikiAccess(userID, wikiID))
</span><span class="lines">@@ -281,7 +281,12 @@
</span><span class="cx">                 else:
</span><span class="cx">                     returnValue(None)
</span><span class="cx">             else:
</span><del>-                returnValue(&quot;original&quot;)
</del><ins>+                # Check proxy access
+                proxy_mode = yield sharee.proxyMode(owner)
+                if proxy_mode == &quot;none&quot;:
+                    returnValue(&quot;original&quot;)
+                else:
+                    returnValue(&quot;read-write&quot; if proxy_mode == &quot;write&quot; else &quot;read-only&quot;)
</ins><span class="cx">         else:
</span><span class="cx">             # Invited shares use access mode from the invite
</span><span class="cx">             # Get the access for self
</span><span class="lines">@@ -318,7 +323,7 @@
</span><span class="cx">         sharee = self.principalForUID(self._newStoreObject.viewerHome().uid())
</span><span class="cx">         access = yield self._checkAccessControl()
</span><span class="cx"> 
</span><del>-        if access == &quot;original&quot;:
</del><ins>+        if access == &quot;original&quot; and not self._newStoreObject.ownerHome().external():
</ins><span class="cx">             original = (yield request.locateResource(self._share_url))
</span><span class="cx">             result = (yield original.accessControlList(request, *args, **kwargs))
</span><span class="cx">             returnValue(result)
</span><span class="lines">@@ -805,6 +810,12 @@
</span><span class="cx"> 
</span><span class="cx">         # Accept the share
</span><span class="cx">         shareeView = yield self._newStoreHome.acceptShare(inviteUID, summary)
</span><ins>+        if shareeView is None:
+            raise HTTPError(ErrorResponse(
+                responsecode.FORBIDDEN,
+                (calendarserver_namespace, &quot;invalid-share&quot;),
+                &quot;Invite UID not valid&quot;,
+            ))
</ins><span class="cx"> 
</span><span class="cx">         # Return the URL of the shared collection
</span><span class="cx">         sharedAsURL = joinURL(self.url(), shareeView.shareName())
</span><span class="lines">@@ -820,7 +831,13 @@
</span><span class="cx">     def declineShare(self, request, inviteUID):
</span><span class="cx"> 
</span><span class="cx">         # Remove it if it is in the DB
</span><del>-        yield self._newStoreHome.declineShare(inviteUID)
</del><ins>+        result = yield self._newStoreHome.declineShare(inviteUID)
+        if not result:
+            raise HTTPError(ErrorResponse(
+                responsecode.FORBIDDEN,
+                (calendarserver_namespace, &quot;invalid-share&quot;),
+                &quot;Invite UID not valid&quot;,
+            ))
</ins><span class="cx">         returnValue(Response(code=responsecode.NO_CONTENT))
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavsimpleresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/simpleresource.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/simpleresource.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/simpleresource.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavsqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/sql.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/sql.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/sql.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavstdconfigpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/stdconfig.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/stdconfig.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/stdconfig.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.test.test_stdconfig -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -318,6 +318,13 @@
</span><span class="cx">                                     # upgrade.
</span><span class="cx"> 
</span><span class="cx">     #
</span><ins>+    # Work queue configuration information
+    #
+    &quot;WorkQueue&quot; : {
+        &quot;ampPort&quot;: 7654,            # Port used for hosts in a cluster to take to each other
+    },
+
+    #
</ins><span class="cx">     # Types of service provided
</span><span class="cx">     #
</span><span class="cx">     &quot;EnableCalDAV&quot;  : True, # Enable CalDAV service
</span><span class="lines">@@ -361,7 +368,7 @@
</span><span class="cx">     #
</span><span class="cx">     # Directory service
</span><span class="cx">     #
</span><del>-    #    A directory service provides information about principals (eg.
</del><ins>+    #    A directory service provides information about principals (e.g.
</ins><span class="cx">     #    users, groups, locations and resources) to the server.
</span><span class="cx">     #
</span><span class="cx">     &quot;DirectoryService&quot;: {
</span><span class="lines">@@ -829,8 +836,9 @@
</span><span class="cx">     &quot;Servers&quot; : {
</span><span class="cx">         &quot;Enabled&quot;: False,                   # Multiple servers enabled or not
</span><span class="cx">         &quot;ConfigFile&quot;: &quot;localservers.xml&quot;,   # File path for server information
</span><del>-        &quot;MaxClients&quot;: 5,                    # Pool size for connections to between servers
</del><ins>+        &quot;MaxClients&quot;: 5,                    # Pool size for connections between servers
</ins><span class="cx">         &quot;InboxName&quot;: &quot;podding&quot;,             # Name for top-level inbox resource
</span><ins>+        &quot;ConduitName&quot;: &quot;conduit&quot;,           # Name for top-level cross-pod resource
</ins><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     #
</span><span class="lines">@@ -1071,8 +1079,11 @@
</span><span class="cx">         def _loadImport(childDict):
</span><span class="cx">             # Look for an import and read that one as the main config and merge the current one into that
</span><span class="cx">             if &quot;ImportConfig&quot; in childDict and childDict.ImportConfig:
</span><del>-                configRoot = os.path.join(childDict.ServerRoot, childDict.ConfigRoot)
-                path = _expandPath(fullServerPath(configRoot, childDict.ImportConfig))
</del><ins>+                if childDict.ImportConfig[0] != &quot;.&quot;:
+                    configRoot = os.path.join(childDict.ServerRoot, childDict.ConfigRoot)
+                    path = _expandPath(fullServerPath(configRoot, childDict.ImportConfig))
+                else:
+                    path = childDict.ImportConfig
</ins><span class="cx">                 if os.path.exists(path):
</span><span class="cx">                     importDict = ConfigDict(self._parseConfigFromFile(path))
</span><span class="cx">                     if importDict:
</span><span class="lines">@@ -1568,6 +1579,7 @@
</span><span class="cx">                         (direction,))
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def _updateSharing(configDict, reloading=False):
</span><span class="cx">     #
</span><span class="cx">     # Sharing
</span><span class="lines">@@ -1578,6 +1590,7 @@
</span><span class="cx">         PerUserDataFilter.IGNORE_X_PROPERTIES.append(propertyName)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def _updateServers(configDict, reloading=False):
</span><span class="cx">     from txdav.caldav.datastore.scheduling.ischedule.localservers import Servers
</span><span class="cx">     if configDict.Servers.Enabled:
</span><span class="lines">@@ -1617,6 +1630,7 @@
</span><span class="cx">             compliance += customxml.calendarserver_partstat_changes_compliance
</span><span class="cx">         if configDict.EnableTimezonesByReference:
</span><span class="cx">             compliance += caldavxml.caldav_timezones_by_reference_compliance
</span><ins>+        compliance += customxml.calendarserver_recurrence_split
</ins><span class="cx">     else:
</span><span class="cx">         compliance = ()
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavstorebridgepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/storebridge.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/storebridge.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/storebridge.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.test.test_wrapping -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -67,7 +67,7 @@
</span><span class="cx">     TooManyAttendeesError, InvalidCalendarAccessError, ValidOrganizerError, \
</span><span class="cx">     InvalidPerUserDataMerge, \
</span><span class="cx">     AttendeeAllowedError, ResourceDeletedError, InvalidAttachmentOperation, \
</span><del>-    ShareeAllowedError, DuplicatePrivateCommentsError
</del><ins>+    ShareeAllowedError, DuplicatePrivateCommentsError, InvalidSplit
</ins><span class="cx"> from txdav.carddav.iaddressbookstore import KindChangeNotAllowedError, \
</span><span class="cx">     GroupWithUnsharedAddressNotAllowedError
</span><span class="cx"> from txdav.common.datastore.sql_tables import _BIND_MODE_READ, _BIND_MODE_WRITE, \
</span><span class="lines">@@ -286,13 +286,6 @@
</span><span class="cx">         return self._parentResource
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def index(self):
-        &quot;&quot;&quot;
-        Retrieve the new-style index wrapper.
-        &quot;&quot;&quot;
-        return self._newStoreObject.retrieveOldIndex()
-
-
</del><span class="cx">     def exists(self):
</span><span class="cx">         # FIXME: tests
</span><span class="cx">         return self._newStoreObject is not None
</span><span class="lines">@@ -303,7 +296,6 @@
</span><span class="cx">         # The newstore implementation supports this directly
</span><span class="cx">         returnValue(
</span><span class="cx">             (yield self._newStoreObject.resourceNamesSinceToken(revision))
</span><del>-            + ([],)
</del><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -347,6 +339,18 @@
</span><span class="cx">         return self._newStoreObject.countObjectResources()
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
+    def resourceExists(self, name):
+        &quot;&quot;&quot;
+        Indicate whether a resource with the specified name exists.
+
+        @return: C{True} if it exists
+        @rtype: C{bool}
+        &quot;&quot;&quot;
+        allNames = yield self._newStoreObject.listObjectResources()
+        returnValue(name in allNames)
+
+
</ins><span class="cx">     def name(self):
</span><span class="cx">         return self._name
</span><span class="cx"> 
</span><span class="lines">@@ -462,6 +466,8 @@
</span><span class="cx">         if self.isShareeResource():
</span><span class="cx">             log.debug(&quot;Removing shared collection %s&quot; % (self,))
</span><span class="cx">             yield self.removeShareeResource(request)
</span><ins>+            # Re-initialize to get stuff setup again now we have no object
+            self._initializeWithHomeChild(None, self._parentResource)
</ins><span class="cx">             returnValue(NO_CONTENT)
</span><span class="cx"> 
</span><span class="cx">         log.debug(&quot;Deleting collection %s&quot; % (self,))
</span><span class="lines">@@ -488,11 +494,6 @@
</span><span class="cx"> 
</span><span class="cx">         # Now do normal delete
</span><span class="cx"> 
</span><del>-        # Handle sharing
-        wasShared = self.isShared()
-        if wasShared:
-            yield self.downgradeFromShare(request)
-
</del><span class="cx">         # Actually delete it.
</span><span class="cx">         yield self._newStoreObject.remove()
</span><span class="cx"> 
</span><span class="lines">@@ -968,6 +969,10 @@
</span><span class="cx">                     )
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def search(self, filter, **kwargs):
+        return self._newStoreObject.search(filter, **kwargs)
+
+
</ins><span class="cx">     def notifierID(self):
</span><span class="cx">         return &quot;%s/%s&quot; % self._newStoreObject.notifierID()
</span><span class="cx"> 
</span><span class="lines">@@ -1121,7 +1126,7 @@
</span><span class="cx">         isowner = (yield self.isOwner(request))
</span><span class="cx">         accessPrincipal = (yield self.resourceOwnerPrincipal(request))
</span><span class="cx"> 
</span><del>-        for name, _ignore_uid, _ignore_type in (yield maybeDeferred(self.index().bruteForceSearch)):
</del><ins>+        for name in (yield self._newStoreObject.listObjectResources()):
</ins><span class="cx">             try:
</span><span class="cx">                 child = yield request.locateChildResource(self, name)
</span><span class="cx">             except TypeError:
</span><span class="lines">@@ -2421,6 +2426,7 @@
</span><span class="cx"> 
</span><span class="cx">         try:
</span><span class="cx">             response = (yield self.storeMove(request, destinationparent, destination.name()))
</span><ins>+            self._newStoreObject = None
</ins><span class="cx">             returnValue(response)
</span><span class="cx"> 
</span><span class="cx">         # Handle the various store errors
</span><span class="lines">@@ -2915,8 +2921,130 @@
</span><span class="cx">         returnValue(result)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
+    def POST_handler_action(self, request, action):
+        &quot;&quot;&quot;
+        Handle a POST request with an action= query parameter
+
+        @param request: the request to process
+        @type request: L{Request}
+        @param action: the action to execute
+        @type action: C{str}
+        &quot;&quot;&quot;
+        if action.startswith(&quot;attachment-&quot;):
+            result = (yield self.POST_handler_attachment(request, action))
+            returnValue(result)
+        else:
+            actioner = {
+                &quot;split&quot;: self.POST_handler_split,
+            }
+            if action in actioner:
+                result = (yield actioner[action](request, action))
+                returnValue(result)
+            else:
+                raise HTTPError(ErrorResponse(
+                    FORBIDDEN,
+                    (caldav_namespace, &quot;valid-action-parameter&quot;,),
+                    &quot;The action parameter in the request-URI is not valid&quot;,
+                ))
+
+
</ins><span class="cx">     @requiresPermissions(davxml.WriteContent())
</span><span class="cx">     @inlineCallbacks
</span><ins>+    def POST_handler_split(self, request, action):
+        &quot;&quot;&quot;
+        Handle a split of a calendar object resource.
+
+        @param request: HTTP request object
+        @type request: L{Request}
+        @param action: The request-URI 'action' argument
+        @type action: C{str}
+
+        @return: an HTTP response
+        &quot;&quot;&quot;
+
+        # Resource must exist
+        if not self.exists():
+            raise HTTPError(NOT_FOUND)
+
+        # Split point is in the rid query parameter
+        rid = request.args.get(&quot;rid&quot;)
+        if rid is None:
+            raise HTTPError(ErrorResponse(
+                FORBIDDEN,
+                (caldav_namespace, &quot;valid-rid-parameter&quot;,),
+                &quot;The rid parameter in the request-URI contains an invalid value&quot;,
+            ))
+
+        try:
+            rid = DateTime.parseText(rid[0])
+        except ValueError:
+            raise HTTPError(ErrorResponse(
+                FORBIDDEN,
+                (caldav_namespace, &quot;valid-rid-parameter&quot;,),
+                &quot;The rid parameter in the request-URI contains an invalid value&quot;,
+            ))
+        try:
+            otherStoreObject = yield self._newStoreObject.splitAt(rid)
+        except InvalidSplit:
+            raise HTTPError(ErrorResponse(
+                FORBIDDEN,
+                (calendarserver_namespace, &quot;invalid-split&quot;,),
+                &quot;The rid parameter in the request-URI contains an invalid value&quot;,
+            ))
+
+        other = yield request.locateChildResource(self._parentResource, otherStoreObject.name())
+        if other is None:
+            raise responsecode.INTERNAL_SERVER_ERROR
+
+        # Look for Prefer header
+        prefer = request.headers.getHeader(&quot;prefer&quot;, {})
+        returnRepresentation = any([key == &quot;return&quot; and value == &quot;representation&quot; for key, value, _ignore_args in prefer])
+
+        if returnRepresentation:
+            # Accept header handling
+            accepted_type = bestAcceptType(request.headers.getHeader(&quot;accept&quot;), Component.allowedTypes())
+            if accepted_type is None:
+                raise HTTPError(StatusResponse(responsecode.NOT_ACCEPTABLE, &quot;Cannot generate requested data type&quot;))
+            etag1 = yield self.etag()
+            etag2 = yield other.etag()
+            cal1 = yield self.component()
+            cal2 = yield other.component()
+
+            xml_responses = [
+                davxml.PropertyStatusResponse(
+                    davxml.HRef.fromString(self.url()),
+                    davxml.PropertyStatus(
+                        davxml.PropertyContainer(
+                            davxml.GETETag.fromString(etag1.generate()),
+                            caldavxml.CalendarData.fromComponent(cal1, accepted_type),
+                        ),
+                        davxml.Status.fromResponseCode(OK),
+                    )
+                ),
+                davxml.PropertyStatusResponse(
+                    davxml.HRef.fromString(other.url()),
+                    davxml.PropertyStatus(
+                        davxml.PropertyContainer(
+                            davxml.GETETag.fromString(etag2.generate()),
+                            caldavxml.CalendarData.fromComponent(cal2, accepted_type),
+                        ),
+                        davxml.Status.fromResponseCode(OK),
+                    )
+                ),
+            ]
+
+            # Return multistatus with calendar data for this resource and the new one
+            result = MultiStatusResponse(xml_responses)
+        else:
+            result = Response(responsecode.NO_CONTENT)
+            result.headers.addRawHeader(&quot;Split-Component-URL&quot;, other.url())
+
+        returnValue(result)
+
+
+    @requiresPermissions(davxml.WriteContent())
+    @inlineCallbacks
</ins><span class="cx">     def POST_handler_attachment(self, request, action):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Handle a managed attachments request on the calendar object resource.
</span><span class="lines">@@ -2929,6 +3057,9 @@
</span><span class="cx">         @return: an HTTP response
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><ins>+        if not config.EnableManagedAttachments:
+            returnValue(StatusResponse(responsecode.FORBIDDEN, &quot;Managed Attachments not supported.&quot;))
+
</ins><span class="cx">         # Resource must exist to allow attachment operations
</span><span class="cx">         if not self.exists():
</span><span class="cx">             raise HTTPError(NOT_FOUND)
</span><span class="lines">@@ -3371,6 +3502,8 @@
</span><span class="cx">         if self.isShareeResource():
</span><span class="cx">             log.debug(&quot;Removing shared resource %s&quot; % (self,))
</span><span class="cx">             yield self.removeShareeResource(request)
</span><ins>+            # Re-initialize to get stuff setup again now we have no object
+            self._initializeWithObject(None, self._newStoreParent)
</ins><span class="cx">             returnValue(NO_CONTENT)
</span><span class="cx">         elif self._newStoreObject.isGroupForSharedAddressBook():
</span><span class="cx">             abCollectionResource = (yield request.locateResource(parentForURL(request.uri)))
</span><span class="lines">@@ -3673,7 +3806,6 @@
</span><span class="cx">         # The newstore implementation supports this directly
</span><span class="cx">         returnValue(
</span><span class="cx">             (yield self._newStoreNotifications.resourceNamesSinceToken(revision))
</span><del>-            + ([],)
</del><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.test -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_accountingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_accounting.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_accounting.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_accounting.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_addressbookmultigetpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_addressbookmultiget.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_addressbookmultiget.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_addressbookmultiget.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_addressbookquerypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_addressbookquery.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_addressbookquery.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_addressbookquery.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_cachepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_cache.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_cache.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_cache.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_caldavxmlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_caldavxml.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_caldavxml.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_caldavxml.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_calendarquerypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_calendarquery.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_calendarquery.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_calendarquery.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -27,7 +27,6 @@
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> from twistedcaldav import ical
</span><span class="cx"> 
</span><del>-from twistedcaldav.query import calendarqueryfilter
</del><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twistedcaldav.test.util import StoreTestCase, SimpleStoreRequest
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="lines">@@ -36,6 +35,7 @@
</span><span class="cx"> from twistedcaldav.ical import Component
</span><span class="cx"> from txdav.caldav.icalendarstore import ComponentUpdateState
</span><span class="cx"> from twistedcaldav.directory.directory import DirectoryService
</span><ins>+from txdav.caldav.datastore.query.filter import TimeRange
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> @inlineCallbacks
</span><span class="lines">@@ -167,7 +167,7 @@
</span><span class="cx">                             cal = property.calendar()
</span><span class="cx">                             instances = cal.expandTimeRanges(query_timerange.end)
</span><span class="cx">                             vevents = [x for x in cal.subcomponents() if x.name() == &quot;VEVENT&quot;]
</span><del>-                            if not calendarqueryfilter.TimeRange(query_timerange).matchinstance(vevents[0], instances):
</del><ins>+                            if not TimeRange(query_timerange).matchinstance(vevents[0], instances):
</ins><span class="cx">                                 self.fail(&quot;REPORT property %r returned calendar %s outside of request time range %r&quot;
</span><span class="cx">                                           % (property, property.calendar, query_timerange))
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_collectioncontentspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_collectioncontents.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_collectioncontents.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_collectioncontents.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_configpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_config.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_config.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_config.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_customxmlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_customxml.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_customxml.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_customxml.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_databasepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_database.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_database.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_database.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_dateopspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_dateops.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_dateops.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_dateops.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_extensionspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_extensions.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_extensions.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_extensions.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- coding: utf-8 -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_freebusyquerypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_freebusyquery.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_freebusyquery.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_freebusyquery.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_icalendarpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_icalendar.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_icalendar.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_icalendar.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_kerberospy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_kerberos.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_kerberos.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_kerberos.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_linkpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_link.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_link.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_link.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_localizationpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_localization.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_localization.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_localization.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_memcachepoolpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_memcachepool.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_memcachepool.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_memcachepool.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_memcachepropspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_memcacheprops.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_memcacheprops.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_memcacheprops.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_mkcalendarpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_mkcalendar.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_mkcalendar.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_mkcalendar.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_multigetpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_multiget.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_multiget.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_multiget.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_optionspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_options.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_options.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_options.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_propspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_props.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_props.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_props.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_resourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_resource.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_resource.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_resource.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_sharingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_sharing.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_sharing.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_sharing.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> from twistedcaldav.test.test_cache import StubResponseCacheResource
</span><span class="cx"> from twistedcaldav.test.util import norequest, StoreTestCase, SimpleStoreRequest
</span><span class="cx"> 
</span><ins>+from txdav.caldav.datastore.test.util import buildDirectory
</ins><span class="cx"> from txdav.common.datastore.sql_tables import _BIND_MODE_DIRECT
</span><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> from txdav.xml.parser import WebDAVDocument
</span><span class="lines">@@ -738,6 +739,8 @@
</span><span class="cx">         home is at /.  Return the name of the newly shared calendar in the
</span><span class="cx">         sharee's home.
</span><span class="cx">         &quot;&quot;&quot;
</span><ins>+
+        self._sqlCalendarStore._directoryService = buildDirectory(homes=(&quot;wiki-testing&quot;,))
</ins><span class="cx">         wcreate = self._sqlCalendarStore.newTransaction(&quot;create wiki&quot;)
</span><span class="cx">         yield wcreate.calendarHomeWithUID(&quot;wiki-testing&quot;, create=True)
</span><span class="cx">         yield wcreate.commit()
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_sqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_sql.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_sql.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_sql.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2007-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2007-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_stdconfigpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_stdconfig.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_stdconfig.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_stdconfig.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- coding: utf-8 -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_timezonespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_timezones.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_timezones.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_timezones.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_timezonestdservicepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_timezonestdservice.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_timezonestdservice.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_timezonestdservice.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_upgradepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_upgrade.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_upgrade.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_upgrade.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_utilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_wrappingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_wrapping.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_wrapping.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_wrapping.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_xmlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_xml.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_xml.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_xml.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -17,12 +17,15 @@
</span><span class="cx"> import os
</span><span class="cx"> 
</span><span class="cx"> from twisted.trial.unittest import SkipTest
</span><ins>+
</ins><span class="cx"> from twistedcaldav.ical import Component
</span><del>-from twistedcaldav.query import calendarqueryfilter
</del><span class="cx"> import twistedcaldav.test.util
</span><span class="cx"> from twistedcaldav.caldavxml import ComponentFilter, PropertyFilter, TextMatch, \
</span><span class="cx">     Filter, TimeRange
</span><span class="cx"> 
</span><ins>+from txdav.caldav.datastore.query.filter import Filter as storeFilter
+from txdav.caldav.datastore.query.filter import ComponentFilter as storeComponentFilter
+
</ins><span class="cx"> class XML (twistedcaldav.test.util.TestCase):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     XML tests
</span><span class="lines">@@ -46,7 +49,7 @@
</span><span class="cx">             else:
</span><span class="cx">                 no = &quot;&quot;
</span><span class="cx"> 
</span><del>-            if has != calendarqueryfilter.ComponentFilter(
</del><ins>+            if has != storeComponentFilter(
</ins><span class="cx">                 ComponentFilter(
</span><span class="cx">                     ComponentFilter(
</span><span class="cx">                         name=component_name
</span><span class="lines">@@ -70,7 +73,7 @@
</span><span class="cx">             else:
</span><span class="cx">                 no = &quot;&quot;
</span><span class="cx"> 
</span><del>-            if has != calendarqueryfilter.ComponentFilter(
</del><ins>+            if has != storeComponentFilter(
</ins><span class="cx">                 ComponentFilter(
</span><span class="cx">                     ComponentFilter(
</span><span class="cx">                         PropertyFilter(
</span><span class="lines">@@ -106,7 +109,7 @@
</span><span class="cx">             else:
</span><span class="cx">                 no = &quot;&quot;
</span><span class="cx"> 
</span><del>-            if has != calendarqueryfilter.ComponentFilter(
</del><ins>+            if has != storeComponentFilter(
</ins><span class="cx">                 ComponentFilter(
</span><span class="cx">                     ComponentFilter(
</span><span class="cx">                         PropertyFilter(
</span><span class="lines">@@ -148,7 +151,7 @@
</span><span class="cx">             else:
</span><span class="cx">                 no = &quot;&quot;
</span><span class="cx"> 
</span><del>-            if has != calendarqueryfilter.Filter(
</del><ins>+            if has != storeFilter(
</ins><span class="cx">                 Filter(
</span><span class="cx">                     ComponentFilter(
</span><span class="cx">                         ComponentFilter(
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtesttest_xmlutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_xmlutil.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_xmlutil.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/test_xmlutil.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/test/util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtimezonespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/timezones.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/timezones.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/timezones.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtimezoneservicepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/timezoneservice.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/timezoneservice.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/timezoneservice.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtimezonestdservicepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/timezonestdservice.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/timezonestdservice.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/timezonestdservice.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavtimezonexmlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/timezonexml.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/timezonexml.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/timezonexml.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavupgradepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/upgrade.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/upgrade.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/upgrade.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.test.test_upgrade -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2007-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2007-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavvcardpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/vcard.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/vcard.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/vcard.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstwistedcaldavxmlutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/xmlutil.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/xmlutil.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/twistedcaldav/xmlutil.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdav__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbase__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasedatastore__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasedatastoredbapiclientpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/dbapiclient.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/dbapiclient.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/dbapiclient.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasedatastorefilepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/file.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/file.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/file.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasedatastoresubpostgrespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/subpostgres.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/subpostgres.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/subpostgres.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.base.datastore.test.test_subpostgres -*-
</span><span class="cx"> # #
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -228,7 +228,7 @@
</span><span class="cx">                 # in /tmp and based on a hash of the data store directory
</span><span class="cx">                 digest = md5(dataStoreDirectory.path).hexdigest()
</span><span class="cx">                 socketDir = &quot;/tmp/ccs_postgres_&quot; + digest
</span><del>-                
</del><ins>+
</ins><span class="cx">             self.socketDir = CachingFilePath(socketDir)
</span><span class="cx">             self.host = self.socketDir.path
</span><span class="cx">             self.port = None
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasedatastoretest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasedatastoretesttest_subpostgrespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/test/test_subpostgres.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/test/test_subpostgres.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/test/test_subpostgres.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasedatastoreutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/datastore/util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.caldav.datastore.test.test_file -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -98,6 +98,12 @@
</span><span class="cx">         return &quot;objectWithResourceID:%s:%s&quot; % (homeResourceID, resourceID)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    # Home child objects by external id
+
+    def keyForObjectWithExternalID(self, homeResourceID, externalID):
+        return &quot;objectWithExternalID:%s:%s&quot; % (homeResourceID, externalID)
+
+
</ins><span class="cx">     # Home metadata (Created/Modified)
</span><span class="cx"> 
</span><span class="cx">     def keyForHomeMetaData(self, homeResourceID):
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystore__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystoreappledouble_xattrpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/appledouble_xattr.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/appledouble_xattr.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/appledouble_xattr.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.base.propertystore.test.test_appledouble -*- ##
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystorebasepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/base.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/base.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/base.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystorenonepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/none.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/none.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/none.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.base.propertystore.test.test_none,txdav.caldav.datastore,txdav.carddav.datastore -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystoresqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/sql.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/sql.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/sql.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.base.propertystore.test.test_sql -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystoretest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystoretestbasepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/base.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/base.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/base.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystoretesttest_appledoublepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_appledouble.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_appledouble.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_appledouble.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystoretesttest_basepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_base.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_base.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_base.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystoretesttest_nonepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_none.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_none.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_none.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystoretesttest_sqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_sql.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_sql.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_sql.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystoretesttest_xattrpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_xattr.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_xattr.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/test/test_xattr.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavbasepropertystorexattrpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/xattr.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/xattr.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/base/propertystore/xattr.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.base.propertystore.test.test_xattr -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldav__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastore__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastorefilepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/file.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/file.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/file.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.caldav.datastore.test.test_file -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreindex_filepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/index_file.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/index_file.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/index_file.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: twistedcaldav.test.test_index -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -15,6 +15,7 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> CalDAV Index.
</span><span class="cx"> 
</span><span class="lines">@@ -43,12 +44,14 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> 
</span><ins>+from txdav.caldav.datastore.query.builder import buildExpression
+from txdav.caldav.datastore.query.filter import Filter
+from txdav.common.datastore.query.filegenerator import sqllitegenerator
</ins><span class="cx"> from txdav.common.icommondatastore import SyncTokenValidException, \
</span><span class="cx">     ReservationError, IndexedSearchException
</span><span class="cx"> 
</span><span class="cx"> from twistedcaldav.dateops import pyCalendarTodatetime
</span><span class="cx"> from twistedcaldav.ical import Component
</span><del>-from twistedcaldav.query import calendarquery, calendarqueryfilter
</del><span class="cx"> from twistedcaldav.sql import AbstractSQLDatabase
</span><span class="cx"> from twistedcaldav.sql import db_prefix
</span><span class="cx"> from twistedcaldav.instance import InvalidOverriddenInstanceError
</span><span class="lines">@@ -275,6 +278,7 @@
</span><span class="cx"> 
</span><span class="cx">         changed = []
</span><span class="cx">         deleted = []
</span><ins>+        invalid = []
</ins><span class="cx">         for name, wasdeleted in results:
</span><span class="cx">             if name:
</span><span class="cx">                 if wasdeleted == 'Y':
</span><span class="lines">@@ -285,7 +289,7 @@
</span><span class="cx">             else:
</span><span class="cx">                 raise SyncTokenValidException
</span><span class="cx"> 
</span><del>-        return changed, deleted,
</del><ins>+        return (changed, deleted, invalid)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def lastRevision(self):
</span><span class="lines">@@ -320,7 +324,7 @@
</span><span class="cx"> 
</span><span class="cx">         # Make sure we have a proper Filter element and get the partial SQL
</span><span class="cx">         # statement to use.
</span><del>-        if isinstance(filter, calendarqueryfilter.Filter):
</del><ins>+        if isinstance(filter, Filter):
</ins><span class="cx">             if fbtype:
</span><span class="cx">                 # Lookup the useruid - try the empty (default) one if needed
</span><span class="cx">                 dbuseruid = self._db_value_for_sql(
</span><span class="lines">@@ -330,7 +334,7 @@
</span><span class="cx">             else:
</span><span class="cx">                 dbuseruid = &quot;&quot;
</span><span class="cx"> 
</span><del>-            qualifiers = calendarquery.sqlcalendarquery(filter, None, dbuseruid, fbtype)
</del><ins>+            qualifiers = sqlcalendarquery(filter, None, dbuseruid, fbtype)
</ins><span class="cx">             if qualifiers is not None:
</span><span class="cx">                 # Determine how far we need to extend the current expansion of
</span><span class="cx">                 # events. If we have an open-ended time-range we will expand one
</span><span class="lines">@@ -437,6 +441,24 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+def sqlcalendarquery(filter, calendarid=None, userid=None, freebusy=False):
+    &quot;&quot;&quot;
+    Convert the supplied calendar-query into a partial SQL statement.
+
+    @param filter: the L{Filter} for the calendar-query to convert.
+    @return: a C{tuple} of (C{str}, C{list}), where the C{str} is the partial SQL statement,
+            and the C{list} is the list of argument substitutions to use with the SQL API execute method.
+            Or return C{None} if it is not possible to create an SQL query to fully match the calendar-query.
+    &quot;&quot;&quot;
+    try:
+        expression = buildExpression(filter, sqllitegenerator.FIELDS)
+        sql = sqllitegenerator(expression, calendarid, userid, freebusy)
+        return sql.generate()
+    except ValueError:
+        return None
+
+
+
</ins><span class="cx"> class CalendarIndex (AbstractCalendarIndex):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Calendar index - abstract class for indexer that indexes calendar objects in a collection.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/schedule.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/schedule.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/schedule.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.caldav.datastore.test.test_scheduling -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastorescheduling__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingaddressmappingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/addressmapping.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/addressmapping.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/addressmapping.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingcaldav__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingcaldavdeliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/delivery.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/delivery.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/delivery.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingcaldavschedulerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/scheduler.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/scheduler.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/scheduler.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingcaldavtest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingcaldavtesttest_deliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/test/test_delivery.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/test/test_delivery.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/test/test_delivery.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingcaldavtesttest_schedulerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/test/test_scheduler.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/test/test_scheduler.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/caldav/test/test_scheduler.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingcuaddresspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/cuaddress.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/cuaddress.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/cuaddress.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingdeliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/delivery.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/delivery.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/delivery.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingfreebusypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/freebusy.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/freebusy.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/freebusy.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -32,10 +32,11 @@
</span><span class="cx"> from twistedcaldav.ical import Component, Property, iCalendarProductID
</span><span class="cx"> from twistedcaldav.instance import InstanceList
</span><span class="cx"> from twistedcaldav.memcacher import Memcacher
</span><del>-from twistedcaldav.query import calendarqueryfilter
</del><span class="cx"> 
</span><ins>+from txdav.caldav.datastore.query.filter import Filter
</ins><span class="cx"> from txdav.caldav.icalendarstore import QueryMaxResources
</span><del>-from txdav.common.icommondatastore import IndexedSearchException
</del><ins>+from txdav.common.icommondatastore import IndexedSearchException, \
+    InternalDataStoreError
</ins><span class="cx"> 
</span><span class="cx"> import uuid
</span><span class="cx"> 
</span><span class="lines">@@ -92,7 +93,6 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-@inlineCallbacks
</del><span class="cx"> def generateFreeBusyInfo(
</span><span class="cx">     calresource,
</span><span class="cx">     fbinfo,
</span><span class="lines">@@ -107,6 +107,86 @@
</span><span class="cx">     logItems=None,
</span><span class="cx"> ):
</span><span class="cx">     &quot;&quot;&quot;
</span><ins>+    Get freebusy information for a calendar. Different behavior for internal vs external calendars.
+
+    See L{_internalGenerateFreeBusyInfo} for argument description.
+    &quot;&quot;&quot;
+
+    # TODO: this method really should be moved to L{CalendarObject} so the internal/external pieces
+    # can be split across L{CalendarObject} and L{CalendarObjectExternal}
+    if calresource.external():
+        return _externalGenerateFreeBusyInfo(
+            calresource,
+            fbinfo,
+            timerange,
+            matchtotal,
+            excludeuid,
+            organizer,
+            organizerPrincipal,
+            same_calendar_user,
+            servertoserver,
+            event_details,
+            logItems
+        )
+    else:
+        return _internalGenerateFreeBusyInfo(
+            calresource,
+            fbinfo,
+            timerange,
+            matchtotal,
+            excludeuid,
+            organizer,
+            organizerPrincipal,
+            same_calendar_user,
+            servertoserver,
+            event_details,
+            logItems
+        )
+
+
+
+@inlineCallbacks
+def _externalGenerateFreeBusyInfo(
+    calresource,
+    fbinfo,
+    timerange,
+    matchtotal,
+    excludeuid=None,
+    organizer=None,
+    organizerPrincipal=None,
+    same_calendar_user=False,
+    servertoserver=False,
+    event_details=None,
+    logItems=None,
+):
+    &quot;&quot;&quot;
+    Generate a freebusy response for an external (cross-pod) calendar by making a cross-pod call. This will bypass
+    any type of smart caching on this pod in favor of using caching on the pod hosting the actual calendar data.
+
+    See L{_internalGenerateFreeBusyInfo} for argument description.
+    &quot;&quot;&quot;
+    fbresults, matchtotal = yield calresource._txn.store().conduit.send_freebusy(calresource, timerange, matchtotal, excludeuid, organizer, organizerPrincipal, same_calendar_user, servertoserver, event_details)
+    for i in range(3):
+        fbinfo[i].extend([Period.parseText(p) for p in fbresults[i]])
+    returnValue(matchtotal)
+
+
+
+@inlineCallbacks
+def _internalGenerateFreeBusyInfo(
+    calresource,
+    fbinfo,
+    timerange,
+    matchtotal,
+    excludeuid=None,
+    organizer=None,
+    organizerPrincipal=None,
+    same_calendar_user=False,
+    servertoserver=False,
+    event_details=None,
+    logItems=None,
+):
+    &quot;&quot;&quot;
</ins><span class="cx">     Run a free busy report on the specified calendar collection
</span><span class="cx">     accumulating the free busy info for later processing.
</span><span class="cx">     @param calresource: the L{Calendar} for a calendar collection.
</span><span class="lines">@@ -203,23 +283,23 @@
</span><span class="cx"> 
</span><span class="cx">         # Create fake filter element to match time-range
</span><span class="cx">         filter = caldavxml.Filter(
</span><del>-                      caldavxml.ComponentFilter(
-                          caldavxml.ComponentFilter(
-                              cache_timerange if caching else timerange,
-                              name=(&quot;VEVENT&quot;, &quot;VFREEBUSY&quot;, &quot;VAVAILABILITY&quot;),
-                          ),
-                          name=&quot;VCALENDAR&quot;,
-                       )
-                  )
-        filter = calendarqueryfilter.Filter(filter)
</del><ins>+            caldavxml.ComponentFilter(
+                caldavxml.ComponentFilter(
+                    cache_timerange if caching else timerange,
+                    name=(&quot;VEVENT&quot;, &quot;VFREEBUSY&quot;, &quot;VAVAILABILITY&quot;),
+                ),
+                name=&quot;VCALENDAR&quot;,
+            )
+        )
+        filter = Filter(filter)
</ins><span class="cx">         tzinfo = filter.settimezone(tz)
</span><span class="cx"> 
</span><span class="cx">         try:
</span><del>-            resources = yield calresource._index.indexedSearch(filter, useruid=attendee_uid, fbtype=True)
</del><ins>+            resources = yield calresource.search(filter, useruid=attendee_uid, fbtype=True)
</ins><span class="cx">             if caching:
</span><span class="cx">                 yield FBCacheEntry.makeCacheEntry(calresource, attendee_uid, cache_timerange, resources)
</span><span class="cx">         except IndexedSearchException:
</span><del>-            resources = yield calresource._index.bruteForceSearch()
</del><ins>+            raise InternalDataStoreError(&quot;Invalid indexedSearch query&quot;)
</ins><span class="cx"> 
</span><span class="cx">     else:
</span><span class="cx">         # Log extended item
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingicaldiffpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/icaldiff.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/icaldiff.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/icaldiff.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingicalsplitterpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/icalsplitter.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/icalsplitter.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/icalsplitter.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -83,17 +83,21 @@
</span><span class="cx">         return len(str(ical)) &gt; self.threshold
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def whereSplit(self, ical):
</del><ins>+    def whereSplit(self, ical, break_point=None, allow_past_the_end=True):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Determine where a split is going to happen - i.e., the RECURRENCE-ID.
</span><span class="cx"> 
</span><span class="cx">         @param ical: the iCalendar object to test
</span><span class="cx">         @type ical: L{Component}
</span><ins>+        @param break_point: the date-time where the break should occur
+        @type break_point: L{DateTime}
</ins><span class="cx"> 
</span><span class="cx">         @return: recurrence-id of the split
</span><span class="cx">         @rtype: L{DateTime}
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><ins>+        break_point = self.past if break_point is None else break_point
+
</ins><span class="cx">         # Find the instance RECURRENCE-ID where a split is going to happen
</span><span class="cx">         now = self.now.duplicate()
</span><span class="cx">         now.offsetDay(1)
</span><span class="lines">@@ -101,14 +105,18 @@
</span><span class="cx">         instances = sorted(instances.instances.values(), key=lambda x: x.start)
</span><span class="cx">         rid = instances[0].rid
</span><span class="cx">         for instance in instances:
</span><del>-            rid = instance.rid
-            if instance.start &gt;= self.past:
</del><ins>+            if instance.start &gt;= break_point:
+                rid = instance.rid
+
+                # Do not allow a rid prior to the first instance
+                if break_point and rid == instances[0].rid:
+                    rid = None
</ins><span class="cx">                 break
</span><span class="cx">         else:
</span><del>-            # We can get here when splitting and event for overrides only in the past,
</del><ins>+            # We can get here when splitting an event for overrides only in the past,
</ins><span class="cx">             # which happens when splitting an Attendee's copy of an Organizer event
</span><span class="cx">             # where the Organizer event has L{willSplit} == C{True}
</span><del>-            rid = self.past
</del><ins>+            rid = break_point if allow_past_the_end else None
</ins><span class="cx"> 
</span><span class="cx">         return rid
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimip__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimipdeliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/delivery.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/delivery.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/delivery.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.caldav.datastore.scheduling.test.test_imip -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimipinboundpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/inbound.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/inbound.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/inbound.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimipmailgatewaypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/mailgateway.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/mailgateway.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/mailgateway.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -234,3 +234,6 @@
</span><span class="cx">         yield txn.imipCreateToken(organizer, attendee, icaluid, token=token)
</span><span class="cx">     yield txn.commit()
</span><span class="cx">     os.remove(oldDB.dbpath)
</span><ins>+    journalPath = oldDB.dbpath + &quot;-journal&quot;
+    if os.path.exists(journalPath):
+        os.remove(journalPath)
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimipoutboundpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/outbound.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/outbound.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/outbound.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimipschedulerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/scheduler.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/scheduler.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/scheduler.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimipsmtpsenderpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/smtpsender.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/smtpsender.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/smtpsender.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimiptest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimiptesttest_deliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/test_delivery.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/test_delivery.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/test_delivery.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimiptesttest_inboundpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/test_inbound.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/test_inbound.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/test_inbound.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimiptesttest_mailgatewaypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/test_mailgateway.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/test_mailgateway.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/test_mailgateway.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimiptesttest_outboundpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/test_outbound.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/test_outbound.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/imip/test/test_outbound.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2008-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingimplicitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/implicit.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/implicit.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/implicit.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> #
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischedule__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduledeliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/delivery.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/delivery.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/delivery.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduledkimpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/dkim.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/dkim.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/dkim.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischedulelocalserverspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/localservers.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/localservers.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/localservers.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -84,6 +84,12 @@
</span><span class="cx">         self._thisServer = None
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def addServer(self, server):
+        self._servers[server.id] = server
+        if server.thisServer:
+            self._thisServer = server
+
+
</ins><span class="cx">     def getServerById(self, id):
</span><span class="cx">         return self._servers.get(id)
</span><span class="cx"> 
</span><span class="lines">@@ -125,16 +131,22 @@
</span><span class="cx">     Represents a server.
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-    def __init__(self):
-        self.id = None
-        self.uri = None
-        self.thisServer = False
</del><ins>+    def __init__(self, id=None, uri=None, sharedSecret=None, thisServer=False):
+        self.id = id
+        self.uri = uri
+        self.thisServer = thisServer
</ins><span class="cx">         self.ips = set()
</span><span class="cx">         self.allowed_from_ips = set()
</span><del>-        self.shared_secret = None
</del><ins>+        self.shared_secret = sharedSecret
</ins><span class="cx">         self.isImplicit = True
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def details(self):
+        if not hasattr(self, &quot;ssl&quot;):
+            self._parseDetails()
+        return (self.ssl, self.host, self.port, self.path,)
+
+
</ins><span class="cx">     def check(self, ignoreIPLookupFailures=False):
</span><span class="cx">         # Check whether this matches the current server
</span><span class="cx">         parsed_uri = urlparse.urlparse(self.uri)
</span><span class="lines">@@ -215,7 +227,28 @@
</span><span class="cx">         return (SERVER_SECRET_HEADER, self.shared_secret,)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def _parseDetails(self):
+        # Extract scheme, host, port and path
+        if self.uri.startswith(&quot;http://&quot;):
+            self.ssl = False
+            rest = self.uri[7:]
+        elif self.uri.startswith(&quot;https://&quot;):
+            self.ssl = True
+            rest = self.uri[8:]
</ins><span class="cx"> 
</span><ins>+        splits = rest.split(&quot;/&quot;, 1)
+        hostport = splits[0].split(&quot;:&quot;)
+        self.host = hostport[0]
+        if len(hostport) &gt; 1:
+            self.port = int(hostport[1])
+        else:
+            self.port = {False: 80, True: 443}[self.ssl]
+        self.path = &quot;/&quot;
+        if len(splits) &gt; 1:
+            self.path += splits[1]
+
+
+
</ins><span class="cx"> ELEMENT_SERVERS = &quot;servers&quot;
</span><span class="cx"> ELEMENT_SERVER = &quot;server&quot;
</span><span class="cx"> ELEMENT_ID = &quot;id&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduleremoteserverspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/remoteservers.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/remoteservers.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/remoteservers.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduleresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/resource.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/resource.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/resource.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduleschedulerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/scheduler.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/scheduler.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/scheduler.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> 
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduletest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduletesttest_deliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_delivery.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_delivery.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_delivery.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduletesttest_dkimpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_dkim.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_dkim.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_dkim.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduletesttest_localserverspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduletesttest_remoteserverspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_remoteservers.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_remoteservers.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_remoteservers.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduletesttest_resourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_resource.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_resource.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_resource.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduletesttest_utilspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_utils.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_utils.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/test/test_utils.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischeduleutilspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/utils.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/utils.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/utils.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingischedulexmlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/xml.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/xml.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/ischedule/xml.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -259,14 +259,18 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @classmethod
</span><del>-    def fromCalendar(clazz, calendar):
</del><ins>+    def fromCalendar(clazz, calendar, format=None):
+        attrs = {}
+        if format is not None and format != &quot;text/calendar&quot;:
+            attrs[&quot;content-type&quot;] = format
+
</ins><span class="cx">         if isinstance(calendar, str):
</span><span class="cx">             if not calendar:
</span><span class="cx">                 raise ValueError(&quot;Missing calendar data&quot;)
</span><span class="cx">             return clazz(PCDATAElement(calendar))
</span><span class="cx">         elif isinstance(calendar, iComponent):
</span><span class="cx">             assert calendar.name() == &quot;VCALENDAR&quot;, &quot;Not a calendar: %r&quot; % (calendar,)
</span><del>-            return clazz(PCDATAElement(calendar.getTextWithTimezones(includeTimezones=not config.EnableTimezonesByReference)))
</del><ins>+            return clazz(PCDATAElement(calendar.getTextWithTimezones(includeTimezones=not config.EnableTimezonesByReference, format=format)))
</ins><span class="cx">         else:
</span><span class="cx">             raise ValueError(&quot;Not a calendar: %s&quot; % (calendar,))
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingitippy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/itip.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/itip.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/itip.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingprocessingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/processing.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/processing.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/processing.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> #
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingschedulerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/scheduler.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/scheduler.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/scheduler.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> 
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingtest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingtesttest_freebusypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_freebusy.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_freebusy.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_freebusy.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingtesttest_icaldiffpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_icaldiff.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_icaldiff.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_icaldiff.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingtesttest_icalsplitterpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_icalsplitter.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_icalsplitter.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_icalsplitter.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -63,6 +63,11 @@
</span><span class="cx">             getattr(self, attrname_12h).offsetHours(12)
</span><span class="cx">             self.subs[attrname_12h] = getattr(self, attrname_12h)
</span><span class="cx"> 
</span><ins>+            attrname_1 = &quot;now_fwd%s_1&quot; % (i + 1,)
+            setattr(self, attrname_1, getattr(self, attrname).duplicate())
+            getattr(self, attrname_1).offsetSeconds(-1)
+            self.subs[attrname_1] = getattr(self, attrname_1)
+
</ins><span class="cx">         self.patch(config, &quot;MaxAllowedInstances&quot;, 500)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1835,6 +1840,160 @@
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="cx">             ),
</span><span class="cx">             (
</span><ins>+                &quot;1.8 - RRULE with COUNT&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:%(now_back30)s
+DURATION:PT1H
+ATTENDEE:mailto:user1@example.com
+ATTENDEE:mailto:user2@example.com
+ATTENDEE:mailto:user3@example.com
+ATTENDEE:mailto:user4@example.com
+ATTENDEE:mailto:user5@example.com
+ATTENDEE:mailto:user6@example.com
+ATTENDEE:mailto:user7@example.com
+ATTENDEE:mailto:user8@example.com
+ATTENDEE:mailto:user9@example.com
+ATTENDEE:mailto:user10@example.com
+ATTENDEE:mailto:user11@example.com
+ATTENDEE:mailto:user12@example.com
+ATTENDEE:mailto:user13@example.com
+ATTENDEE:mailto:user14@example.com
+ATTENDEE:mailto:user15@example.com
+ATTENDEE:mailto:user16@example.com
+ATTENDEE:mailto:user17@example.com
+ATTENDEE:mailto:user18@example.com
+ATTENDEE:mailto:user19@example.com
+ATTENDEE:mailto:user20@example.com
+ATTENDEE:mailto:user21@example.com
+ATTENDEE:mailto:user22@example.com
+ATTENDEE:mailto:user23@example.com
+ATTENDEE:mailto:user24@example.com
+ATTENDEE:mailto:user25@example.com
+ORGANIZER:mailto:user1@example.com
+RRULE:FREQ=DAILY;COUNT=40
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_back25)s
+DTSTART:%(now_back25)s
+DURATION:PT1H
+ATTENDEE:mailto:user1@example.com
+ATTENDEE:mailto:user2@example.com
+ORGANIZER:mailto:user1@example.com
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_back24)s
+DTSTART:%(now_back24)s
+DURATION:PT1H
+ATTENDEE:mailto:user1@example.com
+ATTENDEE:mailto:user2@example.com
+ORGANIZER:mailto:user1@example.com
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:%(now_back14)s
+DURATION:PT1H
+ATTENDEE:mailto:user1@example.com
+ATTENDEE:mailto:user2@example.com
+ATTENDEE:mailto:user3@example.com
+ATTENDEE:mailto:user4@example.com
+ATTENDEE:mailto:user5@example.com
+ATTENDEE:mailto:user6@example.com
+ATTENDEE:mailto:user7@example.com
+ATTENDEE:mailto:user8@example.com
+ATTENDEE:mailto:user9@example.com
+ATTENDEE:mailto:user10@example.com
+ATTENDEE:mailto:user11@example.com
+ATTENDEE:mailto:user12@example.com
+ATTENDEE:mailto:user13@example.com
+ATTENDEE:mailto:user14@example.com
+ATTENDEE:mailto:user15@example.com
+ATTENDEE:mailto:user16@example.com
+ATTENDEE:mailto:user17@example.com
+ATTENDEE:mailto:user18@example.com
+ATTENDEE:mailto:user19@example.com
+ATTENDEE:mailto:user20@example.com
+ATTENDEE:mailto:user21@example.com
+ATTENDEE:mailto:user22@example.com
+ATTENDEE:mailto:user23@example.com
+ATTENDEE:mailto:user24@example.com
+ATTENDEE:mailto:user25@example.com
+ORGANIZER:mailto:user1@example.com
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY;COUNT=24
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:%(relID)s
+DTSTART:%(now_back30)s
+DURATION:PT1H
+ATTENDEE:mailto:user1@example.com
+ATTENDEE:mailto:user2@example.com
+ATTENDEE:mailto:user3@example.com
+ATTENDEE:mailto:user4@example.com
+ATTENDEE:mailto:user5@example.com
+ATTENDEE:mailto:user6@example.com
+ATTENDEE:mailto:user7@example.com
+ATTENDEE:mailto:user8@example.com
+ATTENDEE:mailto:user9@example.com
+ATTENDEE:mailto:user10@example.com
+ATTENDEE:mailto:user11@example.com
+ATTENDEE:mailto:user12@example.com
+ATTENDEE:mailto:user13@example.com
+ATTENDEE:mailto:user14@example.com
+ATTENDEE:mailto:user15@example.com
+ATTENDEE:mailto:user16@example.com
+ATTENDEE:mailto:user17@example.com
+ATTENDEE:mailto:user18@example.com
+ATTENDEE:mailto:user19@example.com
+ATTENDEE:mailto:user20@example.com
+ATTENDEE:mailto:user21@example.com
+ATTENDEE:mailto:user22@example.com
+ATTENDEE:mailto:user23@example.com
+ATTENDEE:mailto:user24@example.com
+ATTENDEE:mailto:user25@example.com
+ORGANIZER:mailto:user1@example.com
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
+END:VEVENT
+BEGIN:VEVENT
+UID:%(relID)s
+RECURRENCE-ID:%(now_back25)s
+DTSTART:%(now_back25)s
+DURATION:PT1H
+ATTENDEE:mailto:user1@example.com
+ATTENDEE:mailto:user2@example.com
+ORGANIZER:mailto:user1@example.com
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+END:VEVENT
+BEGIN:VEVENT
+UID:%(relID)s
+RECURRENCE-ID:%(now_back24)s
+DTSTART:%(now_back24)s
+DURATION:PT1H
+ATTENDEE:mailto:user1@example.com
+ATTENDEE:mailto:user2@example.com
+ORGANIZER:mailto:user1@example.com
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+            ),
+            (
</ins><span class="cx">                 &quot;2.1 - Overrides only - one future, one past&quot;,
</span><span class="cx">                 &quot;&quot;&quot;BEGIN:VCALENDAR
</span><span class="cx"> VERSION:2.0
</span><span class="lines">@@ -2018,3 +2177,188 @@
</span><span class="cx">             # Make sure new items won't split again
</span><span class="cx">             self.assertFalse(splitter.willSplit(icalNew), &quot;Failed future will split: %s&quot; % (title,))
</span><span class="cx">             self.assertFalse(splitter.willSplit(icalOld), &quot;Failed past will split: %s&quot; % (title,))
</span><ins>+
+
+    def test_future_split(self):
+
+        data = (
+            (
+                &quot;1.1 - RRULE with override&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:%(now)s
+DURATION:PT1H
+ATTENDEE:mailto:user1@example.com
+ATTENDEE:mailto:user2@example.com
+ATTENDEE:mailto:user3@example.com
+ATTENDEE:mailto:user4@example.com
+ATTENDEE:mailto:user5@example.com
+ATTENDEE:mailto:user6@example.com
+ATTENDEE:mailto:user7@example.com
+ATTENDEE:mailto:user8@example.com
+ATTENDEE:mailto:user9@example.com
+ATTENDEE:mailto:user10@example.com
+ATTENDEE:mailto:user11@example.com
+ATTENDEE:mailto:user12@example.com
+ATTENDEE:mailto:user13@example.com
+ATTENDEE:mailto:user14@example.com
+ATTENDEE:mailto:user15@example.com
+ATTENDEE:mailto:user16@example.com
+ATTENDEE:mailto:user17@example.com
+ATTENDEE:mailto:user18@example.com
+ATTENDEE:mailto:user19@example.com
+ATTENDEE:mailto:user20@example.com
+ATTENDEE:mailto:user21@example.com
+ATTENDEE:mailto:user22@example.com
+ATTENDEE:mailto:user23@example.com
+ATTENDEE:mailto:user24@example.com
+ATTENDEE:mailto:user25@example.com
+ORGANIZER:mailto:user1@example.com
+RRULE:FREQ=DAILY
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_fwd10)s
+DTSTART:%(now_fwd10)s
+DURATION:PT1H
+ATTENDEE:mailto:user1@example.com
+ATTENDEE:mailto:user2@example.com
+ORGANIZER:mailto:user1@example.com
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_fwd11)s
+DTSTART:%(now_fwd11)s
+DURATION:PT1H
+ATTENDEE:mailto:user1@example.com
+ATTENDEE:mailto:user2@example.com
+ORGANIZER:mailto:user1@example.com
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:%(now_fwd11)s
+DURATION:PT1H
+ATTENDEE:mailto:user1@example.com
+ATTENDEE:mailto:user2@example.com
+ATTENDEE:mailto:user3@example.com
+ATTENDEE:mailto:user4@example.com
+ATTENDEE:mailto:user5@example.com
+ATTENDEE:mailto:user6@example.com
+ATTENDEE:mailto:user7@example.com
+ATTENDEE:mailto:user8@example.com
+ATTENDEE:mailto:user9@example.com
+ATTENDEE:mailto:user10@example.com
+ATTENDEE:mailto:user11@example.com
+ATTENDEE:mailto:user12@example.com
+ATTENDEE:mailto:user13@example.com
+ATTENDEE:mailto:user14@example.com
+ATTENDEE:mailto:user15@example.com
+ATTENDEE:mailto:user16@example.com
+ATTENDEE:mailto:user17@example.com
+ATTENDEE:mailto:user18@example.com
+ATTENDEE:mailto:user19@example.com
+ATTENDEE:mailto:user20@example.com
+ATTENDEE:mailto:user21@example.com
+ATTENDEE:mailto:user22@example.com
+ATTENDEE:mailto:user23@example.com
+ATTENDEE:mailto:user24@example.com
+ATTENDEE:mailto:user25@example.com
+ORGANIZER:mailto:user1@example.com
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_fwd11)s
+DTSTART:%(now_fwd11)s
+DURATION:PT1H
+ATTENDEE:mailto:user1@example.com
+ATTENDEE:mailto:user2@example.com
+ORGANIZER:mailto:user1@example.com
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:%(relID)s
+DTSTART:%(now)s
+DURATION:PT1H
+ATTENDEE:mailto:user1@example.com
+ATTENDEE:mailto:user2@example.com
+ATTENDEE:mailto:user3@example.com
+ATTENDEE:mailto:user4@example.com
+ATTENDEE:mailto:user5@example.com
+ATTENDEE:mailto:user6@example.com
+ATTENDEE:mailto:user7@example.com
+ATTENDEE:mailto:user8@example.com
+ATTENDEE:mailto:user9@example.com
+ATTENDEE:mailto:user10@example.com
+ATTENDEE:mailto:user11@example.com
+ATTENDEE:mailto:user12@example.com
+ATTENDEE:mailto:user13@example.com
+ATTENDEE:mailto:user14@example.com
+ATTENDEE:mailto:user15@example.com
+ATTENDEE:mailto:user16@example.com
+ATTENDEE:mailto:user17@example.com
+ATTENDEE:mailto:user18@example.com
+ATTENDEE:mailto:user19@example.com
+ATTENDEE:mailto:user20@example.com
+ATTENDEE:mailto:user21@example.com
+ATTENDEE:mailto:user22@example.com
+ATTENDEE:mailto:user23@example.com
+ATTENDEE:mailto:user24@example.com
+ATTENDEE:mailto:user25@example.com
+ORGANIZER:mailto:user1@example.com
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY;UNTIL=%(now_fwd11_1)s
+END:VEVENT
+BEGIN:VEVENT
+UID:%(relID)s
+RECURRENCE-ID:%(now_fwd10)s
+DTSTART:%(now_fwd10)s
+DURATION:PT1H
+ATTENDEE:mailto:user1@example.com
+ATTENDEE:mailto:user2@example.com
+ORGANIZER:mailto:user1@example.com
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+            ),
+        )
+
+        for title, calendar, split_future, split_past in data:
+            ical = Component.fromString(calendar % self.subs)
+            splitter = iCalSplitter(1024, 14)
+            icalOld, icalNew = splitter.split(ical, rid=DateTime.parseText(&quot;%(now_fwd11)s&quot; % self.subs))
+            relsubs = dict(self.subs)
+            relsubs[&quot;relID&quot;] = icalOld.resourceUID()
+            self.assertEqual(str(icalNew).replace(&quot;\r\n &quot;, &quot;&quot;), split_future.replace(&quot;\n&quot;, &quot;\r\n&quot;) % relsubs, &quot;Failed future: %s&quot; % (title,))
+            self.assertEqual(str(icalOld).replace(&quot;\r\n &quot;, &quot;&quot;), split_past.replace(&quot;\n&quot;, &quot;\r\n&quot;) % relsubs, &quot;Failed past: %s&quot; % (title,))
+
+            # Make sure new items won't split again
+            self.assertFalse(splitter.willSplit(icalNew), &quot;Failed future will split: %s&quot; % (title,))
+            self.assertFalse(splitter.willSplit(icalOld), &quot;Failed past will split: %s&quot; % (title,))
+
+            ical = Component.fromString(calendar % self.subs)
+            splitter = iCalSplitter(1024, 14)
+            icalOld, icalNew = splitter.split(ical, rid=splitter.whereSplit(ical, break_point=DateTime.parseText(&quot;%(now_fwd10_12h)s&quot; % self.subs)))
+            relsubs = dict(self.subs)
+            relsubs[&quot;relID&quot;] = icalOld.resourceUID()
+            self.assertEqual(str(icalNew).replace(&quot;\r\n &quot;, &quot;&quot;), split_future.replace(&quot;\n&quot;, &quot;\r\n&quot;) % relsubs, &quot;Failed future: %s&quot; % (title,))
+            self.assertEqual(str(icalOld).replace(&quot;\r\n &quot;, &quot;&quot;), split_past.replace(&quot;\n&quot;, &quot;\r\n&quot;) % relsubs, &quot;Failed past: %s&quot; % (title,))
+
+            # Make sure new items won't split again
+            self.assertFalse(splitter.willSplit(icalNew), &quot;Failed future will split: %s&quot; % (title,))
+            self.assertFalse(splitter.willSplit(icalOld), &quot;Failed past will split: %s&quot; % (title,))
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingtesttest_implicitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_implicit.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_implicit.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_implicit.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingtesttest_itippy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_itip.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_itip.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_itip.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingtesttest_pocessingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_pocessing.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_pocessing.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_pocessing.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingtesttest_utilspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_utils.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_utils.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/test/test_utils.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreschedulingutilspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/utils.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/utils.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/scheduling/utils.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> #
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoresqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/sql.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/sql.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/sql.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.caldav.datastore.test.test_sql -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -46,6 +46,7 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed
</span><span class="cx"> from twisted.python import hashlib
</span><ins>+from twisted.python.failure import Failure
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import caldavxml, customxml, ical
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="lines">@@ -57,6 +58,9 @@
</span><span class="cx"> from twistedcaldav.memcacher import Memcacher
</span><span class="cx"> 
</span><span class="cx"> from txdav.base.propertystore.base import PropertyName
</span><ins>+from txdav.caldav.datastore.query.builder import buildExpression
+from txdav.caldav.datastore.query.filter import Filter
+from txdav.caldav.datastore.query.generator import CalDAVSQLQueryGenerator
</ins><span class="cx"> from txdav.caldav.datastore.scheduling.icalsplitter import iCalSplitter
</span><span class="cx"> from txdav.caldav.datastore.scheduling.implicit import ImplicitScheduler
</span><span class="cx"> from txdav.caldav.datastore.util import AttachmentRetrievalTransport, \
</span><span class="lines">@@ -72,12 +76,11 @@
</span><span class="cx">     AttendeeAllowedError, InvalidPerUserDataMerge, ComponentUpdateState, \
</span><span class="cx">     ValidOrganizerError, ShareeAllowedError, ComponentRemoveState, \
</span><span class="cx">     InvalidDefaultCalendar, \
</span><del>-    InvalidAttachmentOperation, DuplicatePrivateCommentsError
</del><ins>+    InvalidAttachmentOperation, DuplicatePrivateCommentsError, \
+    TimeRangeUpperLimit, TimeRangeLowerLimit, InvalidSplit
</ins><span class="cx"> from txdav.caldav.icalendarstore import QuotaExceeded
</span><span class="cx"> from txdav.common.datastore.sql import CommonHome, CommonHomeChild, \
</span><span class="cx">     CommonObjectResource, ECALENDARTYPE
</span><del>-from txdav.common.datastore.sql_legacy import PostgresLegacyIndexEmulator, \
-    PostgresLegacyInboxIndexEmulator
</del><span class="cx"> from txdav.common.datastore.sql_tables import _ATTACHMENTS_MODE_NONE, \
</span><span class="cx">     _ATTACHMENTS_MODE_WRITE, schema, _BIND_MODE_OWN, \
</span><span class="cx">     _ATTACHMENTS_MODE_READ, _TRANSP_OPAQUE, _TRANSP_TRANSPARENT
</span><span class="lines">@@ -87,7 +90,8 @@
</span><span class="cx">     InvalidObjectResourceError, ObjectResourceNameAlreadyExistsError, \
</span><span class="cx">     ObjectResourceNameNotAllowedError, TooManyObjectResourcesError, \
</span><span class="cx">     InvalidUIDError, UIDExistsError, UIDExistsElsewhereError, \
</span><del>-    InvalidResourceMove, InvalidComponentForStoreError
</del><ins>+    InvalidResourceMove, InvalidComponentForStoreError, \
+    NoSuchObjectResourceError
</ins><span class="cx"> from txdav.xml import element
</span><span class="cx"> 
</span><span class="cx"> from txdav.idav import ChangeCategory
</span><span class="lines">@@ -363,7 +367,7 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def calendarObjectWithID(self, txn, rid):
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        Return all child object resources with the specified UID. Only &quot;owned&quot; resources are returned,
</del><ins>+        Return all child object resources with the specified resource id. Only &quot;owned&quot; resources are returned,
</ins><span class="cx">         no shared resources.
</span><span class="cx"> 
</span><span class="cx">         @param txn: transaction to use
</span><span class="lines">@@ -375,7 +379,7 @@
</span><span class="cx">         @rtype: L{CalendarObject} or C{None}
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-        # First find the resource-ids of the (home, parent, object) for each object matching the UID.
</del><ins>+        # First find the resource-ids of the (home, parent, object) for each object matching the resource id.
</ins><span class="cx">         obj = CalendarHome._objectSchema
</span><span class="cx">         bind = CalendarHome._bindSchema
</span><span class="cx">         rows = (yield Select(
</span><span class="lines">@@ -433,12 +437,6 @@
</span><span class="cx">         &quot;VPOLL&quot;: &quot;_default_polls&quot;,
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    def __init__(self, transaction, ownerUID):
-
-        self._childClass = Calendar
-        super(CalendarHome, self).__init__(transaction, ownerUID)
-
-
</del><span class="cx">     @classmethod
</span><span class="cx">     def metadataColumns(cls):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -957,6 +955,12 @@
</span><span class="cx">     _objectSchema = schema.CALENDAR_OBJECT
</span><span class="cx">     _timeRangeSchema = schema.TIME_RANGE
</span><span class="cx"> 
</span><ins>+    # Mapping of iCalendar property name to DB column name
+    _queryFields = {
+        &quot;UID&quot;: _objectSchema.UID,
+        &quot;TYPE&quot;: _objectSchema.ICALENDAR_TYPE,
+    }
+
</ins><span class="cx">     _supportedComponents = None
</span><span class="cx"> 
</span><span class="cx">     def __init__(self, *args, **kw):
</span><span class="lines">@@ -964,10 +968,6 @@
</span><span class="cx">         Initialize a calendar pointing at a record in a database.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         super(Calendar, self).__init__(*args, **kw)
</span><del>-        if self.isInbox():
-            self._index = PostgresLegacyInboxIndexEmulator(self)
-        else:
-            self._index = PostgresLegacyIndexEmulator(self)
</del><span class="cx">         self._transp = _TRANSP_OPAQUE
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1085,6 +1085,45 @@
</span><span class="cx">         self.viewerHome().removedCalendarResource(child.uid())
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
+    def moveObjectResourceHere(self, name, component):
+        &quot;&quot;&quot;
+        Create a new child in this collection as part of a move operation. This needs to be split out because
+        behavior differs for sub-classes and cross-pod operations.
+
+        @param name: new name to use in new parent
+        @type name: C{str} or C{None} for existing name
+        @param component: data for new resource
+        @type component: L{Component}
+        &quot;&quot;&quot;
+
+        # Cross-pod calls come in with component as str or unicode
+        if isinstance(component, str) or isinstance(component, unicode):
+            try:
+                component = self._objectResourceClass._componentClass.fromString(component)
+            except InvalidICalendarDataError as e:
+                raise InvalidComponentForStoreError(str(e))
+
+        yield self._createCalendarObjectWithNameInternal(name, component, internal_state=ComponentUpdateState.RAW)
+
+
+    @inlineCallbacks
+    def moveObjectResourceAway(self, rid, child=None):
+        &quot;&quot;&quot;
+        Remove the child as the result of a move operation. This needs to be split out because
+        behavior differs for sub-classes and cross-pod operations.
+
+        @param rid: the child resource-id to move
+        @type rid: C{int}
+        @param child: the child resource to move - might be C{None} for cross-pod
+        @type child: L{CommonObjectResource}
+        &quot;&quot;&quot;
+
+        if child is None:
+            child = yield self.objectResourceWithID(rid)
+        yield child._removeInternal(internal_state=ComponentRemoveState.INTERNAL)
+
+
</ins><span class="cx">     def calendarObjectsInTimeRange(self, start, end, timeZone):
</span><span class="cx">         raise NotImplementedError()
</span><span class="cx"> 
</span><span class="lines">@@ -1302,6 +1341,37 @@
</span><span class="cx">         yield self.setDefaultAlarm(&quot;empty&quot;, False, False)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def getInviteCopyProperties(self):
+        &quot;&quot;&quot;
+        Get a dictionary of property name/values (as strings) for properties that are shadowable and
+        need to be copied to a sharee's collection when an external (cross-pod) share is created.
+        Sub-classes should override to expose the properties they care about.
+        &quot;&quot;&quot;
+        props = {}
+        for elem in (element.DisplayName, caldavxml.CalendarDescription, caldavxml.CalendarTimeZone, customxml.CalendarColor,):
+            if PropertyName.fromElement(elem) in self.properties():
+                props[elem.sname()] = str(self.properties()[PropertyName.fromElement(elem)])
+        return props
+
+
+    def setInviteCopyProperties(self, props):
+        &quot;&quot;&quot;
+        Copy a set of shadowable properties (as name/value strings) onto this shared resource when
+        a cross-pod invite is processed. Sub-classes should override to expose the properties they
+        care about.
+        &quot;&quot;&quot;
+        # Initialize these for all shares
+        for elem in (caldavxml.CalendarDescription, caldavxml.CalendarTimeZone,):
+            if PropertyName.fromElement(elem) not in self.properties() and elem.sname() in props:
+                self.properties()[PropertyName.fromElement(elem)] = elem.fromString(props[elem.sname()])
+
+        # Only initialize these for direct shares
+        if self.direct():
+            for elem in (element.DisplayName, customxml.CalendarColor,):
+                if PropertyName.fromElement(elem) not in self.properties() and elem.sname() in props:
+                    self.properties()[PropertyName.fromElement(elem)] = elem.fromString(props[elem.sname()])
+
+
</ins><span class="cx">     # FIXME: this is DAV-ish.  Data store calendar objects don't have
</span><span class="cx">     # mime types.  -wsv
</span><span class="cx">     def contentType(self):
</span><span class="lines">@@ -1312,6 +1382,196 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><ins>+    def search(self, filter, useruid=None, fbtype=False):
+        &quot;&quot;&quot;
+        Finds resources matching the given qualifiers.
+        @param filter: the L{Filter} for the calendar-query to execute.
+        @return: an iterable of tuples for each resource matching the
+            given C{qualifiers}. The tuples are C{(name, uid)}, where
+            C{name} is the resource name, C{uid} is the resource UID.
+        &quot;&quot;&quot;
+
+        # We might be passed an L{Filter} or a serialization of one
+        if isinstance(filter, dict):
+            try:
+                filter = Filter.deserialize(filter)
+            except Exception:
+                filter = None
+
+        # Make sure we have a proper Filter element and get the partial SQL statement to use.
+        sql_stmt = self._sqlquery(filter, useruid, fbtype)
+
+        # No result means it is too complex for us
+        if sql_stmt is None:
+            raise IndexedSearchException()
+        sql_stmt, args, usedtimerange = sql_stmt
+
+        # Check for time-range re-expand
+        if usedtimerange is not None:
+
+            today = DateTime.getToday()
+
+            # Determine how far we need to extend the current expansion of
+            # events. If we have an open-ended time-range we will expand
+            # one year past the start. That should catch bounded
+            # recurrences - unbounded will have been indexed with an
+            # &quot;infinite&quot; value always included.
+            maxDate, isStartDate = filter.getmaxtimerange()
+            if maxDate:
+                maxDate = maxDate.duplicate()
+                maxDate.offsetDay(1)
+                maxDate.setDateOnly(True)
+                upperLimit = today + Duration(days=config.FreeBusyIndexExpandMaxDays)
+                if maxDate &gt; upperLimit:
+                    raise TimeRangeUpperLimit(upperLimit)
+                if isStartDate:
+                    maxDate += Duration(days=365)
+
+            # Determine if the start date is too early for the restricted range we
+            # are applying. If it is today or later we don't need to worry about truncation
+            # in the past.
+            minDate, _ignore_isEndDate = filter.getmintimerange()
+            if minDate &gt;= today:
+                minDate = None
+            if minDate is not None and config.FreeBusyIndexLowerLimitDays:
+                truncateLowerLimit = today - Duration(days=config.FreeBusyIndexLowerLimitDays)
+                if minDate &lt; truncateLowerLimit:
+                    raise TimeRangeLowerLimit(truncateLowerLimit)
+
+            if maxDate is not None or minDate is not None:
+                yield self.testAndUpdateIndex(minDate, maxDate)
+
+        rowiter = yield sql_stmt.on(self._txn, **args)
+
+        # Check result for missing resources
+        results = []
+        for row in rowiter:
+            if fbtype:
+                row = list(row)
+                row[4] = 'Y' if row[4] else 'N'
+                row[7] = indexfbtype_to_icalfbtype[row[7]]
+                if row[9] is not None:
+                    row[8] = row[9]
+                row[8] = 'T' if row[8] else 'F'
+                del row[9]
+            results.append(row)
+
+        returnValue(results)
+
+
+    def _sqlquery(self, filter, useruid, fbtype):
+        &quot;&quot;&quot;
+        Convert the supplied addressbook-query into a partial SQL statement.
+
+        @param filter: the L{Filter} for the addressbook-query to convert.
+        @return: a C{tuple} of (C{str}, C{list}), where the C{str} is the partial SQL statement,
+                and the C{list} is the list of argument substitutions to use with the SQL API execute method.
+                Or return C{None} if it is not possible to create an SQL query to fully match the addressbook-query.
+        &quot;&quot;&quot;
+
+        if not isinstance(filter, Filter):
+            return None
+
+        try:
+            expression = buildExpression(filter, self._queryFields)
+            sql = CalDAVSQLQueryGenerator(expression, self, self.id(), useruid, fbtype)
+            return sql.generate()
+        except ValueError:
+            return None
+
+
+    @classproperty
+    def _notExpandedWithinQuery(cls): #@NoSelf
+        &quot;&quot;&quot;
+        Query to find resources that need to be re-expanded
+        &quot;&quot;&quot;
+        co = schema.CALENDAR_OBJECT
+        return Select(
+            [co.RESOURCE_NAME],
+            From=co,
+            Where=((co.RECURRANCE_MIN &gt; Parameter(&quot;minDate&quot;))
+                .Or(co.RECURRANCE_MAX &lt; Parameter(&quot;maxDate&quot;)))
+                .And(co.CALENDAR_RESOURCE_ID == Parameter(&quot;resourceID&quot;))
+        )
+
+
+    @inlineCallbacks
+    def notExpandedWithin(self, minDate, maxDate):
+        &quot;&quot;&quot;
+        Gives all resources which have not been expanded beyond a given date
+        in the database.  (Unused; see above L{postgresqlgenerator}.
+        &quot;&quot;&quot;
+        returnValue([row[0] for row in (
+            yield self._notExpandedWithinQuery.on(
+                self._txn,
+                minDate=pyCalendarTodatetime(normalizeForIndex(minDate)) if minDate is not None else None,
+                maxDate=pyCalendarTodatetime(normalizeForIndex(maxDate)),
+                resourceID=self._resourceID))]
+        )
+
+
+    @inlineCallbacks
+    def reExpandResource(self, name, expand_start, expand_end):
+        &quot;&quot;&quot;
+        Given a resource name, remove it from the database and re-add it
+        with a longer expansion.
+        &quot;&quot;&quot;
+        obj = yield self.calendarObjectWithName(name)
+
+        # Use a new transaction to do this update quickly without locking the row for too long. However, the original
+        # transaction may have the row locked, so use wait=False and if that fails, fall back to using the original txn.
+
+        newTxn = obj.transaction().store().newTransaction()
+        try:
+            yield obj.lock(wait=False, txn=newTxn)
+        except NoSuchObjectResourceError:
+            yield newTxn.commit()
+            returnValue(None)
+        except:
+            yield newTxn.abort()
+            newTxn = None
+
+        # Now do the re-expand using the appropriate transaction
+        try:
+            doExpand = False
+            if newTxn is None:
+                doExpand = True
+            else:
+                # We repeat this check because the resource may have been re-expanded by someone else
+                rmin, rmax = (yield obj.recurrenceMinMax(txn=newTxn))
+
+                # If the resource is not fully expanded, see if within the required range or not.
+                # Note that expand_start could be None if no lower limit is applied, but expand_end will
+                # never be None
+                if rmax is not None and rmax &lt; expand_end:
+                    doExpand = True
+                if rmin is not None and expand_start is not None and rmin &gt; expand_start:
+                    doExpand = True
+
+            if doExpand:
+                yield obj.updateDatabase(
+                    (yield obj.component()),
+                    expand_until=expand_end,
+                    reCreate=True,
+                    txn=newTxn,
+                )
+        finally:
+            if newTxn is not None:
+                yield newTxn.commit()
+
+
+    @inlineCallbacks
+    def testAndUpdateIndex(self, minDate, maxDate):
+        # Find out if the index is expanded far enough
+        names = yield self.notExpandedWithin(minDate, maxDate)
+
+        # Actually expand recurrence max
+        for name in names:
+            self.log.info(&quot;Search falls outside range of index for %s %s to %s&quot; % (name, minDate, maxDate))
+            yield self.reExpandResource(name, minDate, maxDate)
+
+
+    @inlineCallbacks
</ins><span class="cx">     def splitCollectionByComponentTypes(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         If the calendar contains iCalendar data with different component types, then split it into separate collections
</span><span class="lines">@@ -1524,6 +1784,7 @@
</span><span class="cx">     implements(ICalendarObject)
</span><span class="cx"> 
</span><span class="cx">     _objectSchema = schema.CALENDAR_OBJECT
</span><ins>+    _componentClass = VComponent
</ins><span class="cx"> 
</span><span class="cx">     def __init__(self, calendar, name, uid, resourceID=None, options=None):
</span><span class="cx"> 
</span><span class="lines">@@ -1542,36 +1803,20 @@
</span><span class="cx">         self._cachedComponent = None
</span><span class="cx">         self._cachedCommponentPerUser = {}
</span><span class="cx"> 
</span><del>-    _allColumns = [
-        _objectSchema.RESOURCE_ID,
-        _objectSchema.RESOURCE_NAME,
-        _objectSchema.UID,
-        _objectSchema.MD5,
-        Len(_objectSchema.TEXT),
-        _objectSchema.ATTACHMENTS_MODE,
-        _objectSchema.DROPBOX_ID,
-        _objectSchema.ACCESS,
-        _objectSchema.SCHEDULE_OBJECT,
-        _objectSchema.SCHEDULE_TAG,
-        _objectSchema.SCHEDULE_ETAGS,
-        _objectSchema.PRIVATE_COMMENTS,
-        _objectSchema.CREATED,
-        _objectSchema.MODIFIED
-    ]
</del><span class="cx"> 
</span><del>-
</del><span class="cx">     @classmethod
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _createInternal(cls, parent, name, component, internal_state, options=None, split_details=None):
</span><span class="cx"> 
</span><del>-        child = (yield cls.objectWithName(parent, name, None))
</del><ins>+        child = (yield cls.objectWithName(parent, name))
</ins><span class="cx">         if child:
</span><span class="cx">             raise ObjectResourceNameAlreadyExistsError(name)
</span><span class="cx"> 
</span><span class="cx">         if name.startswith(&quot;.&quot;):
</span><span class="cx">             raise ObjectResourceNameNotAllowedError(name)
</span><span class="cx"> 
</span><del>-        objectResource = cls(parent, name, None, None, options=options)
</del><ins>+        c = cls._externalClass if parent.external() else cls
+        objectResource = c(parent, name, None, None, options=options)
</ins><span class="cx">         yield objectResource._setComponentInternal(component, inserting=True, internal_state=internal_state, split_details=split_details)
</span><span class="cx">         yield objectResource._loadPropertyStore(created=True)
</span><span class="cx"> 
</span><span class="lines">@@ -1581,27 +1826,51 @@
</span><span class="cx">         returnValue(objectResource)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def _initFromRow(self, row):
</del><ins>+    @classmethod
+    def _allColumns(cls): #@NoSelf
</ins><span class="cx">         &quot;&quot;&quot;
</span><del>-        Given a select result using the columns from L{_allColumns}, initialize
-        the calendar object resource state.
</del><ins>+        Full set of columns in the object table that need to be loaded to
+        initialize the object resource state.
</ins><span class="cx">         &quot;&quot;&quot;
</span><del>-        (self._resourceID,
-         self._name,
-         self._uid,
-         self._md5,
-         self._size,
-         self._attachment,
-         self._dropboxID,
-         self._access,
-         self._schedule_object,
-         self._schedule_tag,
-         self._schedule_etags,
-         self._private_comments,
-         self._created,
-         self._modified,) = tuple(row)
</del><ins>+        obj = cls._objectSchema
+        return [
+            obj.RESOURCE_ID,
+            obj.RESOURCE_NAME,
+            obj.UID,
+            obj.MD5,
+            Len(obj.TEXT),
+            obj.ATTACHMENTS_MODE,
+            obj.DROPBOX_ID,
+            obj.ACCESS,
+            obj.SCHEDULE_OBJECT,
+            obj.SCHEDULE_TAG,
+            obj.SCHEDULE_ETAGS,
+            obj.PRIVATE_COMMENTS,
+            obj.CREATED,
+            obj.MODIFIED
+        ]
</ins><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @classmethod
+    def _rowAttributes(cls): #@NoSelf
+        return (
+            &quot;_resourceID&quot;,
+            &quot;_name&quot;,
+            &quot;_uid&quot;,
+            &quot;_md5&quot;,
+            &quot;_size&quot;,
+            &quot;_attachment&quot;,
+            &quot;_dropboxID&quot;,
+            &quot;_access&quot;,
+            &quot;_schedule_object&quot;,
+            &quot;_schedule_tag&quot;,
+            &quot;_schedule_etags&quot;,
+            &quot;_private_comments&quot;,
+            &quot;_created&quot;,
+            &quot;_modified&quot;,
+         )
+
+
</ins><span class="cx">     @property
</span><span class="cx">     def _calendar(self):
</span><span class="cx">         return self._parentCollection
</span><span class="lines">@@ -2063,6 +2332,12 @@
</span><span class="cx">                 internal_request=is_internal,
</span><span class="cx">             ))
</span><span class="cx"> 
</span><ins>+            # Set an attribute on this object to indicate that it is valid to check for an event split. We need to do this here so that if a timeout
+            # occurs whilst doing implicit processing (most likely because the event is too big) we are able to subsequently detect that it is OK
+            # to split and then try that.
+            if internal_state not in (ComponentUpdateState.SPLIT_OWNER, ComponentUpdateState.SPLIT_ATTENDEE,) and scheduler.state == &quot;organizer&quot;:
+                self.okToSplit = True
+
</ins><span class="cx">             if do_implicit_action and not is_internal:
</span><span class="cx"> 
</span><span class="cx">                 # Cannot do implicit in sharee's shared calendar
</span><span class="lines">@@ -2177,15 +2452,34 @@
</span><span class="cx">                         raise UIDExistsElsewhereError(&quot;UID already exists in different calendar: %s.&quot; % (elsewhere.calendar().name(),))
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def setComponent(self, component, inserting=False, smart_merge=False):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Public api for storing a component. This will do full data validation checks on the specified component.
</span><span class="cx">         Scheduling will be done automatically.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-        return self._setComponentInternal(component, inserting, ComponentUpdateState.NORMAL, smart_merge)
</del><ins>+        # Cross-pod calls come in with component as str or unicode
+        if isinstance(component, str) or isinstance(component, unicode):
+            try:
+                component = self._componentClass.fromString(component)
+            except InvalidICalendarDataError as e:
+                raise InvalidComponentForStoreError(str(e))
+        try:
+            result = yield self._setComponentInternal(component, inserting, ComponentUpdateState.NORMAL, smart_merge)
+        except Exception:
+            ex = Failure()
</ins><span class="cx"> 
</span><ins>+            # If the failure is due to a txn timeout and we have the special attribute indicating it is OK to
+            # attempt a split, then try splitting only when doing an update.
+            if self._txn.timedout and hasattr(self, &quot;okToSplit&quot;) and not inserting:
+                yield self.timeoutSplit()
</ins><span class="cx"> 
</span><ins>+            ex.raiseException()
+
+        returnValue(result)
+
+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _setComponentInternal(self, component, inserting=False, internal_state=ComponentUpdateState.NORMAL, smart_merge=False, split_details=None):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -2734,9 +3028,10 @@
</span><span class="cx">                 yield NamedLock.acquire(self._txn, &quot;ImplicitUIDLock:%s&quot; % (hashlib.md5(calendar.resourceUID()).hexdigest(),))
</span><span class="cx"> 
</span><span class="cx">         # Need to also remove attachments
</span><del>-        if self._dropboxID:
-            yield DropBoxAttachment.resourceRemoved(self._txn, self._resourceID, self._dropboxID)
-        yield ManagedAttachment.resourceRemoved(self._txn, self._resourceID)
</del><ins>+        if internal_state != ComponentRemoveState.INTERNAL:
+            if self._dropboxID:
+                yield DropBoxAttachment.resourceRemoved(self._txn, self._resourceID, self._dropboxID)
+            yield ManagedAttachment.resourceRemoved(self._txn, self._resourceID)
</ins><span class="cx">         yield super(CalendarObject, self).remove()
</span><span class="cx"> 
</span><span class="cx">         # Do scheduling
</span><span class="lines">@@ -3399,16 +3694,21 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def checkSplit(self):
</del><ins>+    def checkSplit(self, txn=None):
</ins><span class="cx">         &quot;&quot;&quot;
</span><del>-        Determine if the calendar data needs to be split, and enqueue a split work item if needed.
</del><ins>+        Determine if the calendar data needs to be split, and enqueue a split work item if needed. Note we may
+        need to do this in some other transaction.
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         if config.Scheduling.Options.Splitting.Enabled:
</span><span class="cx">             will = (yield self.willSplit())
</span><span class="cx">             if will:
</span><span class="cx">                 notBefore = datetime.datetime.utcnow() + datetime.timedelta(seconds=config.Scheduling.Options.Splitting.Delay)
</span><del>-                work = (yield self._txn.enqueue(CalendarObject.CalendarObjectSplitterWork, resourceID=self._resourceID, notBefore=notBefore))
</del><ins>+                if txn is None:
+                    txn = self._txn
+                work = (yield txn.enqueue(CalendarObject.CalendarObjectSplitterWork, resourceID=self._resourceID, notBefore=notBefore))
+
+                # _workItems is used during unit testing only, to track the created work
</ins><span class="cx">                 if not hasattr(self, &quot;_workItems&quot;):
</span><span class="cx">                     self._workItems = []
</span><span class="cx">                 self._workItems.append(work)
</span><span class="lines">@@ -3427,6 +3727,55 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><ins>+    def timeoutSplit(self):
+        &quot;&quot;&quot;
+        A txn timeout occurred. Check to see if it is possible to split this event and if so schedule that to occur
+        as the timeout might be the result of the resource being too large and doing a split here will allow a
+        subsequent operation to succeed since the split can reduce the size.
+        &quot;&quot;&quot;
+
+        # Can only do if cached data exists
+        if self._cachedComponent:
+            txn = self.transaction().store().newTransaction(&quot;Timeout checkSplit&quot;)
+            yield self.checkSplit(txn=txn)
+            yield txn.commit()
+
+
+    @inlineCallbacks
+    def splitAt(self, rid):
+        &quot;&quot;&quot;
+        User initiated split. We need to verify it is OK to do so first. We will allow any recurring item to
+        be split, but will not allow attendees to split invites.
+
+        @param rid: the date-time where the split should occur. This need not be a specific instance
+            date-time - this method will choose the next instance on or after this value.
+        @type rid: L{DateTime}
+        &quot;&quot;&quot;
+
+        # Must be recurring
+        component = yield self.component()
+        if not component.isRecurring():
+            raise InvalidSplit()
+
+        # Cannot be attendee
+        ownerPrincipal = self.calendar().ownerHome().directoryRecord()
+        organizer = component.getOrganizer()
+        organizerPrincipal = self.directoryService().recordWithCalendarUserAddress(organizer) if organizer else None
+        if organizer is not None and organizerPrincipal.uid != ownerPrincipal.uid:
+            raise InvalidSplit()
+
+        # Determine valid split point
+        splitter = iCalSplitter(1024, 14)
+        rid = splitter.whereSplit(component, break_point=rid, allow_past_the_end=False)
+        if rid is None:
+            raise InvalidSplit()
+
+        # Do split and return new resource
+        olderObject = yield self.split(rid=rid)
+        returnValue(olderObject)
+
+
+    @inlineCallbacks
</ins><span class="cx">     def split(self, onlyThis=False, rid=None, olderUID=None):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Split this and all matching UID calendar objects as per L{iCalSplitter}.
</span><span class="lines">@@ -3469,8 +3818,9 @@
</span><span class="cx">         # Now process this resource, but do implicit scheduling for attendees not hosted on this server.
</span><span class="cx">         # We need to do this before processing attendee copies.
</span><span class="cx">         calendar_old, calendar_new = splitter.split(calendar, rid=rid, olderUID=olderUID)
</span><del>-        calendar_new.bumpiTIPInfo(oldcalendar=calendar, doSequence=True)
-        calendar_old.bumpiTIPInfo(oldcalendar=None, doSequence=True)
</del><ins>+        if calendar_new.getOrganizer() is not None:
+            calendar_new.bumpiTIPInfo(oldcalendar=calendar, doSequence=True)
+            calendar_old.bumpiTIPInfo(oldcalendar=None, doSequence=True)
</ins><span class="cx"> 
</span><span class="cx">         # If the split results in nothing either resource, then there is really nothing
</span><span class="cx">         # to actually split
</span><span class="lines">@@ -3479,7 +3829,7 @@
</span><span class="cx"> 
</span><span class="cx">         # Store changed data
</span><span class="cx">         yield self._setComponentInternal(calendar_new, internal_state=ComponentUpdateState.SPLIT_OWNER, split_details=(rid, olderUID, True,))
</span><del>-        yield self.calendar()._createCalendarObjectWithNameInternal(&quot;%s.ics&quot; % (olderUID,), calendar_old, ComponentUpdateState.SPLIT_OWNER, split_details=(rid, newerUID, False,))
</del><ins>+        olderObject = yield self.calendar()._createCalendarObjectWithNameInternal(&quot;%s.ics&quot; % (olderUID,), calendar_old, ComponentUpdateState.SPLIT_OWNER, split_details=(rid, newerUID, False,))
</ins><span class="cx"> 
</span><span class="cx">         # Split each one - but not this resource
</span><span class="cx">         for resource in resources:
</span><span class="lines">@@ -3487,7 +3837,7 @@
</span><span class="cx">                 continue
</span><span class="cx">             yield resource.splitForAttendee(rid, olderUID)
</span><span class="cx"> 
</span><del>-        returnValue(olderUID)
</del><ins>+        returnValue(olderObject)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -4419,4 +4769,10 @@
</span><span class="cx"> 
</span><span class="cx">         returnValue(location)
</span><span class="cx"> 
</span><ins>+# Hook-up class relationships at the end after they have all been defined
+from txdav.caldav.datastore.sql_external import CalendarHomeExternal, CalendarExternal, CalendarObjectExternal
+CalendarHome._externalClass = CalendarHomeExternal
+CalendarHome._childClass = Calendar
+Calendar._externalClass = CalendarExternal
</ins><span class="cx"> Calendar._objectResourceClass = CalendarObject
</span><ins>+CalendarObject._externalClass = CalendarObjectExternal
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoresql_externalpyfromrev12321CalendarServertrunktxdavcaldavdatastoresql_externalpy"></a>
<div class="copfile"><h4>Copied: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/sql_external.py (from rev 12321, CalendarServer/trunk/txdav/caldav/datastore/sql_external.py) (0 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/sql_external.py                                (rev 0)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/sql_external.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -0,0 +1,217 @@
</span><ins>+# -*- test-case-name: txdav.caldav.datastore.test.test_sql -*-
+##
+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+&quot;&quot;&quot;
+SQL backend for CalDAV storage when resources are external.
+&quot;&quot;&quot;
+
+from twisted.internet.defer import succeed, inlineCallbacks, returnValue
+
+from twext.python.log import Logger
+
+from txdav.caldav.datastore.sql import CalendarHome, Calendar, CalendarObject
+from txdav.caldav.icalendarstore import ComponentUpdateState, ComponentRemoveState
+from txdav.common.datastore.sql_external import CommonHomeExternal, CommonHomeChildExternal, \
+    CommonObjectResourceExternal
+
+log = Logger()
+
+class CalendarHomeExternal(CommonHomeExternal, CalendarHome):
+    &quot;&quot;&quot;
+    Wrapper for a CalendarHome that is external and only supports a limited set of operations.
+    &quot;&quot;&quot;
+
+    def __init__(self, transaction, ownerUID, resourceID):
+
+        CalendarHome.__init__(self, transaction, ownerUID)
+        CommonHomeExternal.__init__(self, transaction, ownerUID, resourceID)
+
+
+    def hasCalendarResourceUIDSomewhereElse(self, uid, ok_object, mode):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def getCalendarResourcesForUID(self, uid):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def calendarObjectWithDropboxID(self, dropboxID):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def getAllDropboxIDs(self):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def getAllAttachmentNames(self):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def getAllManagedIDs(self):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def createdHome(self):
+        &quot;&quot;&quot;
+        No children - make this a no-op.
+        &quot;&quot;&quot;
+        return succeed(None)
+
+
+    def splitCalendars(self):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def ensureDefaultCalendarsExist(self):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def setDefaultCalendar(self, calendar, componentType):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def defaultCalendar(self, componentType, create=True):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def isDefaultCalendar(self, calendar):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def getDefaultAlarm(self, vevent, timed):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def setDefaultAlarm(self, alarm, vevent, timed):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def getAvailability(self):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def setAvailability(self, availability):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+
+class CalendarExternal(CommonHomeChildExternal, Calendar):
+    &quot;&quot;&quot;
+    SQL-based implementation of L{ICalendar}.
+    &quot;&quot;&quot;
+    pass
+
+
+
+class CalendarObjectExternal(CommonObjectResourceExternal, CalendarObject):
+    &quot;&quot;&quot;
+    SQL-based implementation of L{ICalendarObject}.
+    &quot;&quot;&quot;
+
+    @classmethod
+    def _createInternal(cls, parent, name, component, internal_state, options=None, split_details=None):
+        raise AssertionError(&quot;CalendarObjectExternal: not supported&quot;)
+
+
+    def _setComponentInternal(self, component, inserting=False, internal_state=ComponentUpdateState.NORMAL, smart_merge=False, split_details=None):
+        raise AssertionError(&quot;CalendarObjectExternal: not supported&quot;)
+
+
+    def _removeInternal(self, internal_state=ComponentRemoveState.NORMAL):
+        raise AssertionError(&quot;CalendarObjectExternal: not supported&quot;)
+
+
+    @inlineCallbacks
+    def addAttachment(self, rids, content_type, filename, stream):
+        result = yield self._txn.store().conduit.send_add_attachment(self, rids, content_type, filename, stream)
+        managedID, location = result
+        returnValue((ManagedAttachmentExternal(str(managedID)), str(location),))
+
+
+    @inlineCallbacks
+    def updateAttachment(self, managed_id, content_type, filename, stream):
+        result = yield self._txn.store().conduit.send_update_attachment(self, managed_id, content_type, filename, stream)
+        managedID, location = result
+        returnValue((ManagedAttachmentExternal(str(managedID)), str(location),))
+
+
+    @inlineCallbacks
+    def removeAttachment(self, rids, managed_id):
+        yield self._txn.store().conduit.send_remove_attachment(self, rids, managed_id)
+        returnValue(None)
+
+
+
+class ManagedAttachmentExternal(object):
+    &quot;&quot;&quot;
+    Fake managed attachment object returned from L{CalendarObjectExternal.addAttachment} and
+    L{CalendarObjectExternal.updateAttachment}.
+    &quot;&quot;&quot;
+
+    def __init__(self, managedID):
+        self._managedID = managedID
+
+
+    def managedID(self):
+        return self._managedID
+
+
+CalendarExternal._objectResourceClass = CalendarObjectExternal
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.caldav.datastore.test -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretestattachmentsaccountsxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/attachments/accounts.xml (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/attachments/accounts.xml        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/attachments/accounts.xml        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;!--
</span><del>-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
</del><ins>+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx"> Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretestcommonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/common.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/common.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/common.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.caldav.datastore -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -416,12 +416,14 @@
</span><span class="cx">         yield coll.removeNotificationObjectWithUID(&quot;1&quot;)
</span><span class="cx">         st2 = yield coll.syncToken()
</span><span class="cx">         rev2 = self.token2revision(st2)
</span><del>-        changed, deleted = yield coll.resourceNamesSinceToken(rev)
</del><ins>+        changed, deleted, invalid = yield coll.resourceNamesSinceToken(rev)
</ins><span class="cx">         self.assertEquals(set(changed), set([&quot;2.xml&quot;]))
</span><span class="cx">         self.assertEquals(set(deleted), set([&quot;1.xml&quot;]))
</span><del>-        changed, deleted = yield coll.resourceNamesSinceToken(rev2)
</del><ins>+        self.assertEquals(len(invalid), 0)
+        changed, deleted, invalid = yield coll.resourceNamesSinceToken(rev2)
</ins><span class="cx">         self.assertEquals(set(changed), set([]))
</span><span class="cx">         self.assertEquals(set(deleted), set([]))
</span><ins>+        self.assertEquals(len(invalid), 0)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -1602,7 +1604,7 @@
</span><span class="cx"> 
</span><span class="cx">         home = yield self.homeUnderTest()
</span><span class="cx"> 
</span><del>-        changed, deleted = yield home.resourceNamesSinceToken(
</del><ins>+        changed, deleted, invalid = yield home.resourceNamesSinceToken(
</ins><span class="cx">             self.token2revision(st), &quot;infinity&quot;)
</span><span class="cx"> 
</span><span class="cx">         self.assertEquals(set(changed), set([&quot;calendar_1/&quot;,
</span><span class="lines">@@ -1610,11 +1612,13 @@
</span><span class="cx">                                              &quot;calendar_1/2.ics&quot;,
</span><span class="cx">                                              &quot;other-calendar/&quot;]))
</span><span class="cx">         self.assertEquals(set(deleted), set([&quot;calendar_1/2.ics&quot;]))
</span><ins>+        self.assertEquals(invalid, [])
</ins><span class="cx"> 
</span><del>-        changed, deleted = yield home.resourceNamesSinceToken(
</del><ins>+        changed, deleted, invalid = yield home.resourceNamesSinceToken(
</ins><span class="cx">             self.token2revision(st2), &quot;infinity&quot;)
</span><span class="cx">         self.assertEquals(changed, [])
</span><span class="cx">         self.assertEquals(deleted, [])
</span><ins>+        self.assertEquals(invalid, [])
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -1634,12 +1638,14 @@
</span><span class="cx">         yield obj1.remove()
</span><span class="cx">         st2 = yield cal.syncToken()
</span><span class="cx">         rev2 = self.token2revision(st2)
</span><del>-        changed, deleted = yield cal.resourceNamesSinceToken(rev)
</del><ins>+        changed, deleted, invalid = yield cal.resourceNamesSinceToken(rev)
</ins><span class="cx">         self.assertEquals(set(changed), set([&quot;new.ics&quot;]))
</span><span class="cx">         self.assertEquals(set(deleted), set([&quot;2.ics&quot;]))
</span><del>-        changed, deleted = yield cal.resourceNamesSinceToken(rev2)
</del><ins>+        self.assertEquals(len(invalid), 0)
+        changed, deleted, invalid = yield cal.resourceNamesSinceToken(rev2)
</ins><span class="cx">         self.assertEquals(set(changed), set([]))
</span><span class="cx">         self.assertEquals(set(deleted), set([]))
</span><ins>+        self.assertEquals(len(invalid), 0)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -1703,7 +1709,7 @@
</span><span class="cx">         L{ICalendarStore.withEachCalendarHomeDo} executes its C{action}
</span><span class="cx">         argument repeatedly with all homes that have been created.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        additionalUIDs = set('alpha-uid home2 home3 beta-uid'.split())
</del><ins>+        additionalUIDs = set('user01 home2 home3 uid1'.split())
</ins><span class="cx">         txn = self.transactionUnderTest()
</span><span class="cx">         for name in additionalUIDs:
</span><span class="cx">             yield txn.calendarHomeWithUID(name, create=True)
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretesttest_attachmentspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_attachments.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_attachments.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_attachments.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretesttest_filepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_file.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_file.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_file.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretesttest_implicitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_implicit.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_implicit.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_implicit.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretesttest_index_filepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_index_file.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_index_file.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_index_file.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -19,6 +19,7 @@
</span><span class="cx"> from twisted.internet.task import deferLater
</span><span class="cx"> 
</span><span class="cx"> from txdav.caldav.datastore.index_file import Index, MemcachedUIDReserver
</span><ins>+from txdav.caldav.datastore.query.filter import Filter
</ins><span class="cx"> from txdav.common.icommondatastore import ReservationError, \
</span><span class="cx">     InternalDataStoreError
</span><span class="cx"> 
</span><span class="lines">@@ -26,7 +27,6 @@
</span><span class="cx"> from twistedcaldav.caldavxml import TimeRange
</span><span class="cx"> from twistedcaldav.ical import Component, InvalidICalendarDataError
</span><span class="cx"> from twistedcaldav.instance import InvalidOverriddenInstanceError
</span><del>-from twistedcaldav.query import calendarqueryfilter
</del><span class="cx"> from twistedcaldav.test.util import InMemoryMemcacheProtocol
</span><span class="cx"> import twistedcaldav.test.util
</span><span class="cx"> 
</span><span class="lines">@@ -480,7 +480,7 @@
</span><span class="cx">                       name=&quot;VCALENDAR&quot;,
</span><span class="cx">                    )
</span><span class="cx">               )
</span><del>-            filter = calendarqueryfilter.Filter(filter)
</del><ins>+            filter = Filter(filter)
</ins><span class="cx"> 
</span><span class="cx">             resources = yield self.db.indexedSearch(filter)
</span><span class="cx">             index_results = set()
</span><span class="lines">@@ -666,7 +666,7 @@
</span><span class="cx">                       name=&quot;VCALENDAR&quot;,
</span><span class="cx">                    )
</span><span class="cx">               )
</span><del>-            filter = calendarqueryfilter.Filter(filter)
</del><ins>+            filter = Filter(filter)
</ins><span class="cx"> 
</span><span class="cx">             resources = yield self.db.indexedSearch(filter, fbtype=True)
</span><span class="cx">             index_results = set()
</span><span class="lines">@@ -1073,7 +1073,7 @@
</span><span class="cx">                       name=&quot;VCALENDAR&quot;,
</span><span class="cx">                    )
</span><span class="cx">               )
</span><del>-            filter = calendarqueryfilter.Filter(filter)
</del><ins>+            filter = Filter(filter)
</ins><span class="cx"> 
</span><span class="cx">             for useruid, instances in peruserinstances:
</span><span class="cx">                 resources = yield self.db.indexedSearch(filter, useruid=useruid, fbtype=True)
</span><span class="lines">@@ -1142,12 +1142,12 @@
</span><span class="cx">         self.db.deleteResource(&quot;data3.ics&quot;)
</span><span class="cx"> 
</span><span class="cx">         tests = (
</span><del>-            (0, ([&quot;data1.ics&quot;, &quot;data2.ics&quot;, ], [],)),
-            (1, ([&quot;data2.ics&quot;, ], [&quot;data3.ics&quot;, ],)),
-            (2, ([], [&quot;data3.ics&quot;, ],)),
-            (3, ([], [&quot;data3.ics&quot;, ],)),
-            (4, ([], [],)),
-            (5, ([], [],)),
</del><ins>+            (0, ([&quot;data1.ics&quot;, &quot;data2.ics&quot;, ], [], [],)),
+            (1, ([&quot;data2.ics&quot;, ], [&quot;data3.ics&quot;, ], [],)),
+            (2, ([], [&quot;data3.ics&quot;, ], [],)),
+            (3, ([], [&quot;data3.ics&quot;, ], [],)),
+            (4, ([], [], [],)),
+            (5, ([], [], [],)),
</ins><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx">         for revision, results in tests:
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretesttest_schedulepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_schedule.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_schedule.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_schedule.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretesttest_sqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_sql.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_sql.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_sql.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -13,14 +13,6 @@
</span><span class="cx"> # See the License for the specific language governing permissions and
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><del>-from txdav.caldav.datastore.scheduling.processing import ImplicitProcessor
-from txdav.caldav.datastore.scheduling.cuaddress import RemoteCalendarUser, \
-    LocalCalendarUser
-from txdav.caldav.datastore.scheduling.caldav.scheduler import CalDAVScheduler
-from txdav.caldav.datastore.scheduling.scheduler import ScheduleResponseQueue
-from txweb2 import responsecode
-from txdav.caldav.datastore.scheduling.itip import iTIPRequestStatus
-from twistedcaldav.instance import InvalidOverriddenInstanceError
</del><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> Tests for txdav.caldav.datastore.postgres, mostly based on
</span><span class="lines">@@ -32,14 +24,16 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.enterprise.dal.syntax import Select, Parameter, Insert, Delete, \
</span><span class="cx">     Update
</span><del>-from twistedcaldav.ical import Component as VComponent
</del><ins>+from twext.enterprise.ienterprise import AlreadyFinishedError
+
+from txweb2 import responsecode
</ins><span class="cx"> from txweb2.http_headers import MimeType
</span><span class="cx"> from txweb2.stream import MemoryStream
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet import reactor
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, DeferredList, \
</span><span class="cx">     succeed
</span><del>-from twisted.internet.task import deferLater
</del><ins>+from twisted.internet.task import deferLater, Clock
</ins><span class="cx"> from twisted.trial import unittest
</span><span class="cx"> 
</span><span class="cx"> from twistedcaldav import caldavxml, ical
</span><span class="lines">@@ -47,24 +41,33 @@
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twistedcaldav.dateops import datetimeMktime
</span><span class="cx"> from twistedcaldav.ical import Component, normalize_iCalStr, diff_iCalStrs
</span><del>-from twistedcaldav.query import calendarqueryfilter
</del><ins>+from twistedcaldav.instance import InvalidOverriddenInstanceError
</ins><span class="cx"> 
</span><span class="cx"> from txdav.base.propertystore.base import PropertyName
</span><ins>+from txdav.caldav.datastore.query.filter import Filter
+from txdav.caldav.datastore.scheduling.caldav.scheduler import CalDAVScheduler
+from txdav.caldav.datastore.scheduling.cuaddress import RemoteCalendarUser, \
+    LocalCalendarUser
+from txdav.caldav.datastore.scheduling.implicit import ImplicitScheduler
+from txdav.caldav.datastore.scheduling.itip import iTIPRequestStatus
+from txdav.caldav.datastore.scheduling.processing import ImplicitProcessor
+from txdav.caldav.datastore.scheduling.scheduler import ScheduleResponseQueue
</ins><span class="cx"> from txdav.caldav.datastore.test.common import CommonTests as CalendarCommonTests, \
</span><span class="cx">     test_event_text
</span><span class="cx"> from txdav.caldav.datastore.test.test_file import setUpCalendarStore
</span><span class="cx"> from txdav.caldav.datastore.test.util import buildCalendarStore
</span><span class="cx"> from txdav.caldav.datastore.util import _migrateCalendar, migrateHome
</span><del>-from txdav.caldav.icalendarstore import ComponentUpdateState, InvalidDefaultCalendar
-from txdav.common.datastore.sql import ECALENDARTYPE, CommonObjectResource
-from txdav.common.datastore.sql_legacy import PostgresLegacyIndexEmulator
</del><ins>+from txdav.caldav.icalendarstore import ComponentUpdateState, InvalidDefaultCalendar, \
+    InvalidSplit
+from txdav.common.datastore.sql import ECALENDARTYPE, CommonObjectResource, \
+    CommonStoreTransactionMonitor
</ins><span class="cx"> from txdav.common.datastore.sql_tables import schema, _BIND_MODE_DIRECT, \
</span><span class="cx">     _BIND_STATUS_ACCEPTED
</span><span class="cx"> from txdav.common.datastore.test.util import populateCalendarsFrom, \
</span><span class="cx">     CommonCommonTests
</span><span class="cx"> from txdav.common.icommondatastore import NoSuchObjectResourceError
</span><ins>+from txdav.idav import ChangeCategory
</ins><span class="cx"> from txdav.xml.rfc2518 import GETContentLanguage, ResourceType
</span><del>-from txdav.idav import ChangeCategory
</del><span class="cx"> 
</span><span class="cx"> import datetime
</span><span class="cx"> 
</span><span class="lines">@@ -407,10 +410,10 @@
</span><span class="cx">                           name=&quot;VCALENDAR&quot;,
</span><span class="cx">                        )
</span><span class="cx">                   )
</span><del>-        filter = calendarqueryfilter.Filter(filter)
</del><ins>+        filter = Filter(filter)
</ins><span class="cx">         filter.settimezone(None)
</span><span class="cx"> 
</span><del>-        results = yield toCalendar._index.indexedSearch(filter, 'user01', True)
</del><ins>+        results = yield toCalendar.search(filter, 'user01', True)
</ins><span class="cx">         self.assertEquals(len(results), 1)
</span><span class="cx">         _ignore_name, uid, _ignore_type, _ignore_organizer, _ignore_float, _ignore_start, _ignore_end, _ignore_fbtype, transp = results[0]
</span><span class="cx">         self.assertEquals(uid, &quot;uid4&quot;)
</span><span class="lines">@@ -618,7 +621,7 @@
</span><span class="cx"> 
</span><span class="cx">         @inlineCallbacks
</span><span class="cx">         def _defer1():
</span><del>-            yield cal1.createObjectResourceWithName(&quot;1.ics&quot;, VComponent.fromString(
</del><ins>+            yield cal1.createObjectResourceWithName(&quot;1.ics&quot;, Component.fromString(
</ins><span class="cx"> &quot;&quot;&quot;BEGIN:VCALENDAR
</span><span class="cx"> VERSION:2.0
</span><span class="cx"> PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
</span><span class="lines">@@ -664,7 +667,7 @@
</span><span class="cx"> 
</span><span class="cx">         @inlineCallbacks
</span><span class="cx">         def _defer2():
</span><del>-            yield cal2.createObjectResourceWithName(&quot;2.ics&quot;, VComponent.fromString(
</del><ins>+            yield cal2.createObjectResourceWithName(&quot;2.ics&quot;, Component.fromString(
</ins><span class="cx"> &quot;&quot;&quot;BEGIN:VCALENDAR
</span><span class="cx"> VERSION:2.0
</span><span class="cx"> PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
</span><span class="lines">@@ -825,7 +828,7 @@
</span><span class="cx">         # Create calendar object
</span><span class="cx">         calendar1 = yield self.calendarUnderTest()
</span><span class="cx">         name = &quot;test.ics&quot;
</span><del>-        component = VComponent.fromString(test_event_text)
</del><ins>+        component = Component.fromString(test_event_text)
</ins><span class="cx">         metadata = {
</span><span class="cx">             &quot;accessMode&quot;: &quot;PUBLIC&quot;,
</span><span class="cx">             &quot;isScheduleObject&quot;: True,
</span><span class="lines">@@ -873,7 +876,7 @@
</span><span class="cx">         inbox = yield home.createCalendarWithName(&quot;inbox&quot;)
</span><span class="cx"> 
</span><span class="cx">         name = &quot;test.ics&quot;
</span><del>-        component = VComponent.fromString(test_event_text)
</del><ins>+        component = Component.fromString(test_event_text)
</ins><span class="cx">         metadata = {
</span><span class="cx">             &quot;accessMode&quot;: &quot;PUBLIC&quot;,
</span><span class="cx">             &quot;isScheduleObject&quot;: True,
</span><span class="lines">@@ -922,7 +925,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         home = yield self.homeUnderTest()
</span><span class="cx">         inbox = yield home.createCalendarWithName(&quot;inbox&quot;)
</span><del>-        component = VComponent.fromString(test_event_text)
</del><ins>+        component = Component.fromString(test_event_text)
</ins><span class="cx">         inboxItem = yield inbox.createCalendarObjectWithName(&quot;inbox.ics&quot;, component)
</span><span class="cx">         self.assertEquals(ChangeCategory.inbox, inboxItem.removeNotifyCategory())
</span><span class="cx">         yield self.commit()
</span><span class="lines">@@ -935,7 +938,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         home = yield self.homeUnderTest()
</span><span class="cx">         nonInbox = yield home.createCalendarWithName(&quot;noninbox&quot;)
</span><del>-        component = VComponent.fromString(test_event_text)
</del><ins>+        component = Component.fromString(test_event_text)
</ins><span class="cx">         nonInboxItem = yield nonInbox.createCalendarObjectWithName(&quot;inbox.ics&quot;, component)
</span><span class="cx">         self.assertEquals(ChangeCategory.default, nonInboxItem.removeNotifyCategory())
</span><span class="cx">         yield self.commit()
</span><span class="lines">@@ -1105,9 +1108,10 @@
</span><span class="cx">         self.assertTrue(calendar2_vtodo is not None)
</span><span class="cx">         children = yield calendar2_vtodo.listCalendarObjects()
</span><span class="cx">         self.assertEqual(len(children), 2)
</span><del>-        changed, deleted = yield calendar2_vtodo.resourceNamesSinceToken(None)
</del><ins>+        changed, deleted, invalid = yield calendar2_vtodo.resourceNamesSinceToken(None)
</ins><span class="cx">         self.assertEqual(sorted(changed), [&quot;3.ics&quot;, &quot;5.ics&quot;])
</span><span class="cx">         self.assertEqual(len(deleted), 0)
</span><ins>+        self.assertEqual(len(invalid), 0)
</ins><span class="cx">         result = yield calendar2_vtodo.getSupportedComponents()
</span><span class="cx">         self.assertEquals(result, &quot;VTODO&quot;)
</span><span class="cx">         self.assertTrue(pkey in calendar2_vtodo.properties())
</span><span class="lines">@@ -1118,9 +1122,10 @@
</span><span class="cx">         self.assertEqual(len(children), 3)
</span><span class="cx">         new_sync_token2 = yield calendar2.syncToken()
</span><span class="cx">         self.assertNotEqual(new_sync_token2, original_sync_token2)
</span><del>-        changed, deleted = yield calendar2.resourceNamesSinceToken(original_sync_token2)
</del><ins>+        changed, deleted, invalid = yield calendar2.resourceNamesSinceToken(original_sync_token2)
</ins><span class="cx">         self.assertEqual(len(changed), 0)
</span><span class="cx">         self.assertEqual(sorted(deleted), [&quot;3.ics&quot;, &quot;5.ics&quot;])
</span><ins>+        self.assertEqual(len(invalid), 0)
</ins><span class="cx">         result = yield calendar2.getSupportedComponents()
</span><span class="cx">         self.assertEquals(result, &quot;VEVENT&quot;)
</span><span class="cx">         self.assertTrue(pkey in calendar2.properties())
</span><span class="lines">@@ -1369,7 +1374,7 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_notExpandedWithin(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        Test PostgresLegacyIndexEmulator.notExpandedWithin to make sure it returns the correct
</del><ins>+        Test Calendar.notExpandedWithin to make sure it returns the correct
</ins><span class="cx">         result based on the ranges passed in.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -1378,7 +1383,6 @@
</span><span class="cx">         # Create the index on a new calendar
</span><span class="cx">         home = yield self.homeUnderTest()
</span><span class="cx">         newcalendar = yield home.createCalendarWithName(&quot;index_testing&quot;)
</span><del>-        index = PostgresLegacyIndexEmulator(newcalendar)
</del><span class="cx"> 
</span><span class="cx">         # Create the calendar object to use for testing
</span><span class="cx">         nowYear = self.nowYear[&quot;now&quot;]
</span><span class="lines">@@ -1406,37 +1410,37 @@
</span><span class="cx">         # Fully within range
</span><span class="cx">         testMin = DateTime(nowYear, 1, 1, 0, 0, 0, tzid=Timezone(utc=True))
</span><span class="cx">         testMax = DateTime(nowYear + 1, 1, 1, 0, 0, 0, tzid=Timezone(utc=True))
</span><del>-        result = yield index.notExpandedWithin(testMin, testMax)
</del><ins>+        result = yield newcalendar.notExpandedWithin(testMin, testMax)
</ins><span class="cx">         self.assertEqual(result, [])
</span><span class="cx"> 
</span><span class="cx">         # Upper bound exceeded
</span><span class="cx">         testMin = DateTime(nowYear, 1, 1, 0, 0, 0, tzid=Timezone(utc=True))
</span><span class="cx">         testMax = DateTime(nowYear + 5, 1, 1, 0, 0, 0, tzid=Timezone(utc=True))
</span><del>-        result = yield index.notExpandedWithin(testMin, testMax)
</del><ins>+        result = yield newcalendar.notExpandedWithin(testMin, testMax)
</ins><span class="cx">         self.assertEqual(result, [&quot;indexing.ics&quot;])
</span><span class="cx"> 
</span><span class="cx">         # Lower bound exceeded
</span><span class="cx">         testMin = DateTime(nowYear - 5, 1, 1, 0, 0, 0, tzid=Timezone(utc=True))
</span><span class="cx">         testMax = DateTime(nowYear + 1, 1, 1, 0, 0, 0, tzid=Timezone(utc=True))
</span><del>-        result = yield index.notExpandedWithin(testMin, testMax)
</del><ins>+        result = yield newcalendar.notExpandedWithin(testMin, testMax)
</ins><span class="cx">         self.assertEqual(result, [&quot;indexing.ics&quot;])
</span><span class="cx"> 
</span><span class="cx">         # Lower and upper bounds exceeded
</span><span class="cx">         testMin = DateTime(nowYear - 5, 1, 1, 0, 0, 0, tzid=Timezone(utc=True))
</span><span class="cx">         testMax = DateTime(nowYear + 5, 1, 1, 0, 0, 0, tzid=Timezone(utc=True))
</span><del>-        result = yield index.notExpandedWithin(testMin, testMax)
</del><ins>+        result = yield newcalendar.notExpandedWithin(testMin, testMax)
</ins><span class="cx">         self.assertEqual(result, [&quot;indexing.ics&quot;])
</span><span class="cx"> 
</span><span class="cx">         # Lower none within range
</span><span class="cx">         testMin = None
</span><span class="cx">         testMax = DateTime(nowYear + 1, 1, 1, 0, 0, 0, tzid=Timezone(utc=True))
</span><del>-        result = yield index.notExpandedWithin(testMin, testMax)
</del><ins>+        result = yield newcalendar.notExpandedWithin(testMin, testMax)
</ins><span class="cx">         self.assertEqual(result, [])
</span><span class="cx"> 
</span><span class="cx">         # Lower none and upper bounds exceeded
</span><span class="cx">         testMin = None
</span><span class="cx">         testMax = DateTime(nowYear + 5, 1, 1, 0, 0, 0, tzid=Timezone(utc=True))
</span><del>-        result = yield index.notExpandedWithin(testMin, testMax)
</del><ins>+        result = yield newcalendar.notExpandedWithin(testMin, testMax)
</ins><span class="cx">         self.assertEqual(result, [&quot;indexing.ics&quot;])
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1542,8 +1546,8 @@
</span><span class="cx"> 
</span><span class="cx">         # Tests on inbox - resources with properties
</span><span class="cx">         txn = self.transactionUnderTest()
</span><del>-        yield txn.homeWithUID(ECALENDARTYPE, &quot;byNameTest&quot;, create=True)
-        inbox = yield self.calendarUnderTest(txn=txn, name=&quot;inbox&quot;, home=&quot;byNameTest&quot;)
</del><ins>+        yield txn.homeWithUID(ECALENDARTYPE, &quot;user01&quot;, create=True)
+        inbox = yield self.calendarUnderTest(txn=txn, name=&quot;inbox&quot;, home=&quot;user01&quot;)
</ins><span class="cx">         caldata = &quot;&quot;&quot;BEGIN:VCALENDAR
</span><span class="cx"> VERSION:2.0
</span><span class="cx"> CALSCALE:GREGORIAN
</span><span class="lines">@@ -1574,7 +1578,7 @@
</span><span class="cx">         yield _createInboxItem(&quot;4.ics&quot;, &quot;p4&quot;)
</span><span class="cx">         yield self.commit()
</span><span class="cx"> 
</span><del>-        inbox = yield self.calendarUnderTest(name=&quot;inbox&quot;, home=&quot;byNameTest&quot;)
</del><ins>+        inbox = yield self.calendarUnderTest(name=&quot;inbox&quot;, home=&quot;user01&quot;)
</ins><span class="cx">         yield _tests(inbox)
</span><span class="cx"> 
</span><span class="cx">         resources = yield inbox.objectResourcesWithNames((&quot;1.ics&quot;,))
</span><span class="lines">@@ -2415,7 +2419,8 @@
</span><span class="cx">         will = yield cobj.willSplit()
</span><span class="cx">         self.assertTrue(will)
</span><span class="cx"> 
</span><del>-        newUID = yield cobj.split()
</del><ins>+        newObj = yield cobj.split()
+        newUID = newObj.uid()
</ins><span class="cx">         yield self.commit()
</span><span class="cx"> 
</span><span class="cx">         cobj1 = yield self.calendarObjectUnderTest(name=&quot;data1.ics&quot;, calendar_name=&quot;calendar&quot;, home=&quot;user01&quot;)
</span><span class="lines">@@ -5144,3 +5149,1085 @@
</span><span class="cx">         self.assertEqual(details[1][0], &quot;urn:uuid:user01&quot;)
</span><span class="cx">         self.assertEqual(details[1][1], (&quot;mailto:cuser01@example.org&quot;,))
</span><span class="cx">         self.assertEqual(normalize_iCalStr(details[1][2]), normalize_iCalStr(data_past_external) % relsubs, &quot;Failed past: %s\n%s&quot; % (title, diff_iCalStrs(details[1][2], data_past_external % relsubs),))
</span><ins>+
+
+    @inlineCallbacks
+    def test_calendarObjectSplit_timeout(self):
+        &quot;&quot;&quot;
+        Test that splitting of calendar objects works.
+        &quot;&quot;&quot;
+        data_init = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:%(now_back30)s
+DURATION:PT2H
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+DTSTAMP:20051222T210507Z
+ORGANIZER:mailto:user01@example.com
+RRULE:FREQ=DAILY
+SUMMARY:1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_back25)s
+DTSTART:%(now_back25)s
+DURATION:PT1H
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+DTSTAMP:20051222T210507Z
+ORGANIZER:mailto:user01@example.com
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_back24)s
+DTSTART:%(now_back24)s
+DURATION:PT1H
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+DTSTAMP:20051222T210507Z
+ORGANIZER:mailto:user01@example.com
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_fwd10)s
+DTSTART:%(now_fwd10)s
+DURATION:PT1H
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+DTSTAMP:20051222T210507Z
+ORGANIZER:mailto:user01@example.com
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;
+
+        data = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:%(now_back30)s
+DURATION:PT1H
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+DTSTAMP:20051222T210507Z
+ORGANIZER:mailto:user01@example.com
+RRULE:FREQ=DAILY
+SUMMARY:1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_back25)s
+DTSTART:%(now_back25)s
+DURATION:PT1H
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+DTSTAMP:20051222T210507Z
+ORGANIZER:mailto:user01@example.com
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_back24)s
+DTSTART:%(now_back24)s
+DURATION:PT1H
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+DTSTAMP:20051222T210507Z
+ORGANIZER:mailto:user01@example.com
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_fwd10)s
+DTSTART:%(now_fwd10)s
+DURATION:PT1H
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+DTSTAMP:20051222T210507Z
+ORGANIZER:mailto:user01@example.com
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;
+
+        data_future = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:%(now_back14)s
+DURATION:PT2H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY
+SEQUENCE:1
+SUMMARY:1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_fwd10)s
+DTSTART:%(now_fwd10)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+SEQUENCE:1
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;
+
+        data_past = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:%(relID)s
+DTSTART:%(now_back30)s
+DURATION:PT2H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
+SEQUENCE:1
+SUMMARY:1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+END:VEVENT
+BEGIN:VEVENT
+UID:%(relID)s
+RECURRENCE-ID:%(now_back25)s
+DTSTART:%(now_back25)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+SEQUENCE:1
+END:VEVENT
+BEGIN:VEVENT
+UID:%(relID)s
+RECURRENCE-ID:%(now_back24)s
+DTSTART:%(now_back24)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+SEQUENCE:1
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;
+
+        data_future2 = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:%(now_back14)s
+DURATION:PT2H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY
+SEQUENCE:1
+SUMMARY:1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_fwd10)s
+DTSTART:%(now_fwd10)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+SEQUENCE:1
+END:VEVENT
+BEGIN:X-CALENDARSERVER-PERUSER
+UID:12345-67890
+X-CALENDARSERVER-PERUSER-UID:user02
+BEGIN:X-CALENDARSERVER-PERINSTANCE
+TRANSP:TRANSPARENT
+END:X-CALENDARSERVER-PERINSTANCE
+END:X-CALENDARSERVER-PERUSER
+END:VCALENDAR
+&quot;&quot;&quot;
+
+        data_past2 = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:%(relID)s
+DTSTART:%(now_back30)s
+DURATION:PT2H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
+SEQUENCE:1
+SUMMARY:1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+END:VEVENT
+BEGIN:VEVENT
+UID:%(relID)s
+RECURRENCE-ID:%(now_back25)s
+DTSTART:%(now_back25)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+SEQUENCE:1
+END:VEVENT
+BEGIN:VEVENT
+UID:%(relID)s
+RECURRENCE-ID:%(now_back24)s
+DTSTART:%(now_back24)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+SEQUENCE:1
+END:VEVENT
+BEGIN:X-CALENDARSERVER-PERUSER
+UID:%(relID)s
+X-CALENDARSERVER-PERUSER-UID:user02
+BEGIN:X-CALENDARSERVER-PERINSTANCE
+TRANSP:TRANSPARENT
+END:X-CALENDARSERVER-PERINSTANCE
+END:X-CALENDARSERVER-PERUSER
+END:VCALENDAR
+&quot;&quot;&quot;
+
+        data_inbox2 = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:REQUEST
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:%(now_back14)s
+DURATION:PT2H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY
+SEQUENCE:1
+SUMMARY:1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_fwd10)s
+DTSTART:%(now_fwd10)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+SEQUENCE:1
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;
+
+        # Create one event without active split
+        self.patch(config.Scheduling.Options.Splitting, &quot;Enabled&quot;, False)
+        calendar = yield self.calendarUnderTest(name=&quot;calendar&quot;, home=&quot;user01&quot;)
+        component = Component.fromString(data_init % self.subs)
+        cobj = yield calendar.createCalendarObjectWithName(&quot;data1.ics&quot;, component)
+        self.assertFalse(hasattr(cobj, &quot;_workItems&quot;))
+        yield self.commit()
+
+        w = schema.CALENDAR_OBJECT_SPLITTER_WORK
+        rows = yield Select(
+            [w.RESOURCE_ID, ],
+            From=w
+        ).on(self.transactionUnderTest())
+        self.assertEqual(len(rows), 0)
+        yield self.abort()
+
+        # Turn on splitting
+        self.patch(config.Scheduling.Options.Splitting, &quot;Enabled&quot;, True)
+        self.patch(config.Scheduling.Options.Splitting, &quot;Size&quot;, 1024)
+        self.patch(config.Scheduling.Options.Splitting, &quot;PastDays&quot;, 14)
+        self.patch(config.Scheduling.Options.Splitting, &quot;Delay&quot;, 2)
+
+        # Setup timeouts
+        c = Clock()
+        self.patch(CommonStoreTransactionMonitor, &quot;callLater&quot;, c.callLater)
+
+        # Patch config to turn on transaction timeouts then rebuild the store
+        self.patch(self.storeUnderTest(), &quot;timeoutTransactions&quot;, 1)
+        cobj = yield self.calendarObjectUnderTest(name=&quot;data1.ics&quot;, calendar_name=&quot;calendar&quot;, home=&quot;user01&quot;)
+
+        self.assertFalse(self.transactionUnderTest().timedout)
+
+        oldScheduling = ImplicitScheduler.doImplicitScheduling
+        def newScheduling(self, do_smart_merge=False, split_details=None):
+            c.advance(2)
+            return oldScheduling(self, do_smart_merge, split_details)
+        self.patch(ImplicitScheduler, &quot;doImplicitScheduling&quot;, newScheduling)
+
+        component = Component.fromString(data % self.subs)
+        yield self.failUnlessFailure(cobj.setComponent(component), AlreadyFinishedError)
+        self.assertTrue(self.transactionUnderTest().timedout)
+        work = cobj._workItems[0]
+
+        # Clear out timed out state
+        self.lastTransaction = None
+        self.patch(self.storeUnderTest(), &quot;timeoutTransactions&quot;, 0)
+
+        w = schema.CALENDAR_OBJECT_SPLITTER_WORK
+        rows = yield Select(
+            [w.RESOURCE_ID, ],
+            From=w
+        ).on(self.transactionUnderTest())
+        self.assertEqual(len(rows), 1)
+        self.assertEqual(rows[0][0], cobj._resourceID)
+        yield self.abort()
+
+        # Wait for it to complete
+        yield work.whenExecuted()
+
+        rows = yield Select(
+            [w.RESOURCE_ID, ],
+            From=w
+        ).on(self.transactionUnderTest())
+        self.assertEqual(len(rows), 0)
+        yield self.abort()
+
+        # Get the existing and new object data
+        cobj1 = yield self.calendarObjectUnderTest(name=&quot;data1.ics&quot;, calendar_name=&quot;calendar&quot;, home=&quot;user01&quot;)
+        self.assertTrue(cobj1.isScheduleObject)
+        ical1 = yield cobj1.component()
+        newUID = ical1.masterComponent().propertyValue(&quot;RELATED-TO&quot;)
+
+        cobj2 = yield self.calendarObjectUnderTest(name=&quot;%s.ics&quot; % (newUID,), calendar_name=&quot;calendar&quot;, home=&quot;user01&quot;)
+        self.assertTrue(cobj2 is not None)
+        self.assertTrue(cobj2.isScheduleObject)
+
+        ical_future = yield cobj1.component()
+        ical_past = yield cobj2.component()
+
+        # Verify user01 data
+        title = &quot;user01&quot;
+        relsubs = dict(self.subs)
+        relsubs[&quot;relID&quot;] = newUID
+        self.assertEqual(normalize_iCalStr(ical_future), normalize_iCalStr(data_future) % relsubs, &quot;Failed future: %s&quot; % (title,))
+        self.assertEqual(normalize_iCalStr(ical_past), normalize_iCalStr(data_past) % relsubs, &quot;Failed past: %s&quot; % (title,))
+
+        # Get user02 data
+        cal = yield self.calendarUnderTest(name=&quot;calendar&quot;, home=&quot;user02&quot;)
+        cobjs = yield cal.calendarObjects()
+        self.assertEqual(len(cobjs), 2)
+        for cobj in cobjs:
+            ical = yield cobj.component()
+            if ical.resourceUID() == &quot;12345-67890&quot;:
+                ical_future = ical
+            else:
+                ical_past = ical
+
+        cal = yield self.calendarUnderTest(name=&quot;inbox&quot;, home=&quot;user02&quot;)
+        cobjs = yield cal.calendarObjects()
+        self.assertEqual(len(cobjs), 1)
+        ical_inbox = yield cobjs[0].component()
+
+        # Verify user02 data
+        title = &quot;user02&quot;
+        self.assertEqual(normalize_iCalStr(ical_future), normalize_iCalStr(data_future2) % relsubs, &quot;Failed future: %s&quot; % (title,))
+        self.assertEqual(normalize_iCalStr(ical_past), normalize_iCalStr(data_past2) % relsubs, &quot;Failed past: %s&quot; % (title,))
+        self.assertEqual(normalize_iCalStr(ical_inbox), normalize_iCalStr(data_inbox2) % relsubs, &quot;Failed inbox: %s&quot; % (title,))
+
+
+    @inlineCallbacks
+    def _setupSplitAt(self):
+        &quot;&quot;&quot;
+        Test that user triggered splitting of calendar objects works.
+        &quot;&quot;&quot;
+        self.patch(config.Scheduling.Options.Splitting, &quot;Enabled&quot;, False)
+        self.patch(config.Scheduling.Options.Splitting, &quot;Size&quot;, 1024)
+        self.patch(config.Scheduling.Options.Splitting, &quot;PastDays&quot;, 14)
+        self.patch(config.Scheduling.Options.Splitting, &quot;Delay&quot;, 2)
+
+        # Create one event that will split
+        calendar = yield self.calendarUnderTest(name=&quot;calendar&quot;, home=&quot;user01&quot;)
+
+        data = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:%(now_back28)s
+DURATION:PT1H
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+DTSTAMP:20051222T210507Z
+ORGANIZER:mailto:user01@example.com
+RRULE:FREQ=DAILY;COUNT=50
+SUMMARY:1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_back25)s
+DTSTART:%(now_back25)s
+DURATION:PT1H
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+DTSTAMP:20051222T210507Z
+ORGANIZER:mailto:user01@example.com
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_back24)s
+DTSTART:%(now_back24)s
+DURATION:PT1H
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+DTSTAMP:20051222T210507Z
+ORGANIZER:mailto:user01@example.com
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_fwd10)s
+DTSTART:%(now_fwd10)s
+DURATION:PT1H
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+DTSTAMP:20051222T210507Z
+ORGANIZER:mailto:user01@example.com
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;
+
+        data_future = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:%(now_back14)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY;COUNT=36
+SEQUENCE:1
+SUMMARY:1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_fwd10)s
+DTSTART:%(now_fwd10)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+SEQUENCE:1
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;
+
+        data_past = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:%(relID)s
+DTSTART:%(now_back28)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
+SEQUENCE:1
+SUMMARY:1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+END:VEVENT
+BEGIN:VEVENT
+UID:%(relID)s
+RECURRENCE-ID:%(now_back25)s
+DTSTART:%(now_back25)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+SEQUENCE:1
+END:VEVENT
+BEGIN:VEVENT
+UID:%(relID)s
+RECURRENCE-ID:%(now_back24)s
+DTSTART:%(now_back24)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+SEQUENCE:1
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;
+
+        data_future2 = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:%(now_back14)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY;COUNT=36
+SEQUENCE:1
+SUMMARY:1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_fwd10)s
+DTSTART:%(now_fwd10)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+SEQUENCE:1
+END:VEVENT
+BEGIN:X-CALENDARSERVER-PERUSER
+UID:12345-67890
+X-CALENDARSERVER-PERUSER-UID:user02
+BEGIN:X-CALENDARSERVER-PERINSTANCE
+TRANSP:TRANSPARENT
+END:X-CALENDARSERVER-PERINSTANCE
+END:X-CALENDARSERVER-PERUSER
+END:VCALENDAR
+&quot;&quot;&quot;
+
+        data_past2 = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:%(relID)s
+DTSTART:%(now_back28)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
+SEQUENCE:1
+SUMMARY:1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+END:VEVENT
+BEGIN:VEVENT
+UID:%(relID)s
+RECURRENCE-ID:%(now_back25)s
+DTSTART:%(now_back25)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+SEQUENCE:1
+END:VEVENT
+BEGIN:VEVENT
+UID:%(relID)s
+RECURRENCE-ID:%(now_back24)s
+DTSTART:%(now_back24)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+SEQUENCE:1
+END:VEVENT
+BEGIN:X-CALENDARSERVER-PERUSER
+UID:%(relID)s
+X-CALENDARSERVER-PERUSER-UID:user02
+BEGIN:X-CALENDARSERVER-PERINSTANCE
+TRANSP:TRANSPARENT
+END:X-CALENDARSERVER-PERINSTANCE
+END:X-CALENDARSERVER-PERUSER
+END:VCALENDAR
+&quot;&quot;&quot;
+
+        data_inbox2 = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:REQUEST
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:%(now_back14)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY;COUNT=36
+SEQUENCE:1
+SUMMARY:1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_fwd10)s
+DTSTART:%(now_fwd10)s
+DURATION:PT1H
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
+DTSTAMP:20051222T210507Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+SEQUENCE:1
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;
+
+        # Create it
+        component = Component.fromString(data % self.subs)
+        cobj = yield calendar.createCalendarObjectWithName(&quot;data1.ics&quot;, component)
+        self.assertFalse(hasattr(cobj, &quot;_workItems&quot;))
+        yield self.commit()
+
+        w = schema.CALENDAR_OBJECT_SPLITTER_WORK
+        rows = yield Select(
+            [w.RESOURCE_ID, ],
+            From=w
+        ).on(self.transactionUnderTest())
+        self.assertEqual(len(rows), 0)
+        yield self.abort()
+
+        returnValue((data_future, data_past, data_future2, data_past2, data_inbox2,))
+
+
+    @inlineCallbacks
+    def _setupSplitAt2(self):
+        &quot;&quot;&quot;
+        Test that user triggered splitting of calendar objects works.
+        &quot;&quot;&quot;
+        self.patch(config.Scheduling.Options.Splitting, &quot;Enabled&quot;, False)
+        self.patch(config.Scheduling.Options.Splitting, &quot;Size&quot;, 1024)
+        self.patch(config.Scheduling.Options.Splitting, &quot;PastDays&quot;, 14)
+        self.patch(config.Scheduling.Options.Splitting, &quot;Delay&quot;, 2)
+
+        # Create one event that will split
+        calendar = yield self.calendarUnderTest(name=&quot;calendar&quot;, home=&quot;user01&quot;)
+
+        data = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:%(now_back28)s
+DURATION:PT1H
+DTSTAMP:20051222T210507Z
+RRULE:FREQ=DAILY;COUNT=50
+SUMMARY:1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_back25)s
+DTSTART:%(now_back25)s
+DURATION:PT1H
+DTSTAMP:20051222T210507Z
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_back24)s
+DTSTART:%(now_back24)s
+DURATION:PT1H
+DTSTAMP:20051222T210507Z
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_fwd10)s
+DTSTART:%(now_fwd10)s
+DURATION:PT1H
+DTSTAMP:20051222T210507Z
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;
+
+        data_future = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:%(now_back14)s
+DURATION:PT1H
+DTSTAMP:20051222T210507Z
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY;COUNT=36
+SUMMARY:1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:%(now_fwd10)s
+DTSTART:%(now_fwd10)s
+DURATION:PT1H
+DTSTAMP:20051222T210507Z
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;
+
+        data_past = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:%(relID)s
+DTSTART:%(now_back28)s
+DURATION:PT1H
+DTSTAMP:20051222T210507Z
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
+SUMMARY:1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890
+END:VEVENT
+BEGIN:VEVENT
+UID:%(relID)s
+RECURRENCE-ID:%(now_back25)s
+DTSTART:%(now_back25)s
+DURATION:PT1H
+DTSTAMP:20051222T210507Z
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+END:VEVENT
+BEGIN:VEVENT
+UID:%(relID)s
+RECURRENCE-ID:%(now_back24)s
+DTSTART:%(now_back24)s
+DURATION:PT1H
+DTSTAMP:20051222T210507Z
+RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;
+
+        # Create it
+        component = Component.fromString(data % self.subs)
+        cobj = yield calendar.createCalendarObjectWithName(&quot;data1.ics&quot;, component)
+        self.assertFalse(hasattr(cobj, &quot;_workItems&quot;))
+        yield self.commit()
+
+        w = schema.CALENDAR_OBJECT_SPLITTER_WORK
+        rows = yield Select(
+            [w.RESOURCE_ID, ],
+            From=w
+        ).on(self.transactionUnderTest())
+        self.assertEqual(len(rows), 0)
+        yield self.abort()
+
+        returnValue((data_future, data_past,))
+
+
+    @inlineCallbacks
+    def test_calendarObjectSplit_splitat_ok(self):
+        &quot;&quot;&quot;
+        Test that user triggered splitting of calendar objects works.
+        &quot;&quot;&quot;
+
+        data_future, data_past, data_future2, data_past2, data_inbox2 = yield self._setupSplitAt()
+
+        # Update it
+        cobj = yield self.calendarObjectUnderTest(name=&quot;data1.ics&quot;, calendar_name=&quot;calendar&quot;, home=&quot;user01&quot;)
+        oldobj = yield cobj.splitAt(DateTime.parseText(&quot;%(now_back14)s&quot; % self.subs))
+        oldname = oldobj.name()
+        self.assertFalse(hasattr(cobj, &quot;_workItems&quot;))
+        yield self.commit()
+
+        w = schema.CALENDAR_OBJECT_SPLITTER_WORK
+        rows = yield Select(
+            [w.RESOURCE_ID, ],
+            From=w
+        ).on(self.transactionUnderTest())
+        self.assertEqual(len(rows), 0)
+        yield self.abort()
+
+        rows = yield Select(
+            [w.RESOURCE_ID, ],
+            From=w
+        ).on(self.transactionUnderTest())
+        self.assertEqual(len(rows), 0)
+        yield self.abort()
+
+        # Get the existing and new object data
+        cobj1 = yield self.calendarObjectUnderTest(name=&quot;data1.ics&quot;, calendar_name=&quot;calendar&quot;, home=&quot;user01&quot;)
+        self.assertTrue(cobj1.isScheduleObject)
+        ical1 = yield cobj1.component()
+        newUID = ical1.masterComponent().propertyValue(&quot;RELATED-TO&quot;)
+
+        cobj2 = yield self.calendarObjectUnderTest(name=oldname, calendar_name=&quot;calendar&quot;, home=&quot;user01&quot;)
+        self.assertTrue(cobj2 is not None)
+        self.assertTrue(cobj2.isScheduleObject)
+
+        ical_future = yield cobj1.component()
+        ical_past = yield cobj2.component()
+
+        # Verify user01 data
+        title = &quot;user01&quot;
+        relsubs = dict(self.subs)
+        relsubs[&quot;relID&quot;] = newUID
+        self.assertEqual(normalize_iCalStr(ical_future), normalize_iCalStr(data_future) % relsubs, &quot;Failed future: %s&quot; % (title,))
+        self.assertEqual(normalize_iCalStr(ical_past), normalize_iCalStr(data_past) % relsubs, &quot;Failed past: %s&quot; % (title,))
+
+        # Get user02 data
+        cal = yield self.calendarUnderTest(name=&quot;calendar&quot;, home=&quot;user02&quot;)
+        cobjs = yield cal.calendarObjects()
+        self.assertEqual(len(cobjs), 2)
+        for cobj in cobjs:
+            ical = yield cobj.component()
+            if ical.resourceUID() == &quot;12345-67890&quot;:
+                ical_future = ical
+            else:
+                ical_past = ical
+
+        cal = yield self.calendarUnderTest(name=&quot;inbox&quot;, home=&quot;user02&quot;)
+        cobjs = yield cal.calendarObjects()
+        self.assertEqual(len(cobjs), 1)
+        ical_inbox = yield cobjs[0].component()
+
+        # Verify user02 data
+        title = &quot;user02&quot;
+        self.assertEqual(normalize_iCalStr(ical_future), normalize_iCalStr(data_future2) % relsubs, &quot;Failed future: %s&quot; % (title,))
+        self.assertEqual(normalize_iCalStr(ical_past), normalize_iCalStr(data_past2) % relsubs, &quot;Failed past: %s&quot; % (title,))
+        self.assertEqual(normalize_iCalStr(ical_inbox), normalize_iCalStr(data_inbox2) % relsubs, &quot;Failed inbox: %s&quot; % (title,))
+
+
+    @inlineCallbacks
+    def test_calendarObjectSplit_splitat_ok_not_instance_rid(self):
+        &quot;&quot;&quot;
+        Test that user triggered splitting of calendar objects works when split between instances.
+        &quot;&quot;&quot;
+
+        data_future, data_past, data_future2, data_past2, data_inbox2 = yield self._setupSplitAt()
+
+        # Update it
+        cobj = yield self.calendarObjectUnderTest(name=&quot;data1.ics&quot;, calendar_name=&quot;calendar&quot;, home=&quot;user01&quot;)
+        oldobj = yield cobj.splitAt(DateTime.parseText(&quot;%(now_back15_12h)s&quot; % self.subs))
+        oldname = oldobj.name()
+        self.assertFalse(hasattr(cobj, &quot;_workItems&quot;))
+        yield self.commit()
+
+        w = schema.CALENDAR_OBJECT_SPLITTER_WORK
+        rows = yield Select(
+            [w.RESOURCE_ID, ],
+            From=w
+        ).on(self.transactionUnderTest())
+        self.assertEqual(len(rows), 0)
+        yield self.abort()
+
+        rows = yield Select(
+            [w.RESOURCE_ID, ],
+            From=w
+        ).on(self.transactionUnderTest())
+        self.assertEqual(len(rows), 0)
+        yield self.abort()
+
+        # Get the existing and new object data
+        cobj1 = yield self.calendarObjectUnderTest(name=&quot;data1.ics&quot;, calendar_name=&quot;calendar&quot;, home=&quot;user01&quot;)
+        self.assertTrue(cobj1.isScheduleObject)
+        ical1 = yield cobj1.component()
+        newUID = ical1.masterComponent().propertyValue(&quot;RELATED-TO&quot;)
+
+        cobj2 = yield self.calendarObjectUnderTest(name=oldname, calendar_name=&quot;calendar&quot;, home=&quot;user01&quot;)
+        self.assertTrue(cobj2 is not None)
+        self.assertTrue(cobj2.isScheduleObject)
+
+        ical_future = yield cobj1.component()
+        ical_past = yield cobj2.component()
+
+        # Verify user01 data
+        title = &quot;user01&quot;
+        relsubs = dict(self.subs)
+        relsubs[&quot;relID&quot;] = newUID
+        self.assertEqual(normalize_iCalStr(ical_future), normalize_iCalStr(data_future) % relsubs, &quot;Failed future: %s&quot; % (title,))
+        self.assertEqual(normalize_iCalStr(ical_past), normalize_iCalStr(data_past) % relsubs, &quot;Failed past: %s&quot; % (title,))
+
+        # Get user02 data
+        cal = yield self.calendarUnderTest(name=&quot;calendar&quot;, home=&quot;user02&quot;)
+        cobjs = yield cal.calendarObjects()
+        self.assertEqual(len(cobjs), 2)
+        for cobj in cobjs:
+            ical = yield cobj.component()
+            if ical.resourceUID() == &quot;12345-67890&quot;:
+                ical_future = ical
+            else:
+                ical_past = ical
+
+        cal = yield self.calendarUnderTest(name=&quot;inbox&quot;, home=&quot;user02&quot;)
+        cobjs = yield cal.calendarObjects()
+        self.assertEqual(len(cobjs), 1)
+        ical_inbox = yield cobjs[0].component()
+
+        # Verify user02 data
+        title = &quot;user02&quot;
+        self.assertEqual(normalize_iCalStr(ical_future), normalize_iCalStr(data_future2) % relsubs, &quot;Failed future: %s&quot; % (title,))
+        self.assertEqual(normalize_iCalStr(ical_past), normalize_iCalStr(data_past2) % relsubs, &quot;Failed past: %s&quot; % (title,))
+        self.assertEqual(normalize_iCalStr(ical_inbox), normalize_iCalStr(data_inbox2) % relsubs, &quot;Failed inbox: %s&quot; % (title,))
+
+
+    @inlineCallbacks
+    def test_calendarObjectSplit_splitat_no_organizer(self):
+        &quot;&quot;&quot;
+        Test that user triggered splitting of calendar objects works when no organizer is present.
+        &quot;&quot;&quot;
+
+        data_future, data_past = yield self._setupSplitAt2()
+
+        # Update it
+        cobj = yield self.calendarObjectUnderTest(name=&quot;data1.ics&quot;, calendar_name=&quot;calendar&quot;, home=&quot;user01&quot;)
+        oldobj = yield cobj.splitAt(DateTime.parseText(&quot;%(now_back14)s&quot; % self.subs))
+        oldname = oldobj.name()
+        self.assertFalse(hasattr(cobj, &quot;_workItems&quot;))
+        yield self.commit()
+
+        w = schema.CALENDAR_OBJECT_SPLITTER_WORK
+        rows = yield Select(
+            [w.RESOURCE_ID, ],
+            From=w
+        ).on(self.transactionUnderTest())
+        self.assertEqual(len(rows), 0)
+        yield self.abort()
+
+        rows = yield Select(
+            [w.RESOURCE_ID, ],
+            From=w
+        ).on(self.transactionUnderTest())
+        self.assertEqual(len(rows), 0)
+        yield self.abort()
+
+        # Get the existing and new object data
+        cobj1 = yield self.calendarObjectUnderTest(name=&quot;data1.ics&quot;, calendar_name=&quot;calendar&quot;, home=&quot;user01&quot;)
+        self.assertTrue(cobj1.isScheduleObject)
+        ical1 = yield cobj1.component()
+        newUID = ical1.masterComponent().propertyValue(&quot;RELATED-TO&quot;)
+
+        cobj2 = yield self.calendarObjectUnderTest(name=oldname, calendar_name=&quot;calendar&quot;, home=&quot;user01&quot;)
+        self.assertTrue(cobj2 is not None)
+        self.assertTrue(cobj2.isScheduleObject)
+
+        ical_future = yield cobj1.component()
+        ical_past = yield cobj2.component()
+
+        # Verify user01 data
+        title = &quot;user01&quot;
+        relsubs = dict(self.subs)
+        relsubs[&quot;relID&quot;] = newUID
+        self.assertEqual(normalize_iCalStr(ical_future), normalize_iCalStr(data_future) % relsubs, &quot;Failed future: %s&quot; % (title,))
+        self.assertEqual(normalize_iCalStr(ical_past), normalize_iCalStr(data_past) % relsubs, &quot;Failed past: %s&quot; % (title,))
+
+
+    @inlineCallbacks
+    def test_calendarObjectSplit_splitat_no_attendee_split(self):
+        &quot;&quot;&quot;
+        Test that user triggered splitting of calendar objects does not work if done by attendee.
+        &quot;&quot;&quot;
+
+        yield self._setupSplitAt()
+
+        # Update it
+        cal = yield self.calendarUnderTest(name=&quot;calendar&quot;, home=&quot;user02&quot;)
+        cobjs = yield cal.calendarObjects()
+        self.assertEqual(len(cobjs), 1)
+        yield self.failUnlessFailure(cobjs[0].splitAt(DateTime.parseText(&quot;%(now_back14)s&quot; % self.subs)), InvalidSplit)
+
+
+    @inlineCallbacks
+    def test_calendarObjectSplit_splitat_too_old(self):
+        &quot;&quot;&quot;
+        Test that user triggered splitting of calendar objects does not work if split before first instance.
+        &quot;&quot;&quot;
+
+        yield self._setupSplitAt()
+
+        # Update it
+        cal = yield self.calendarUnderTest(name=&quot;calendar&quot;, home=&quot;user02&quot;)
+        cobjs = yield cal.calendarObjects()
+        self.assertEqual(len(cobjs), 1)
+        yield self.failUnlessFailure(cobjs[0].splitAt(DateTime.parseText(&quot;%(now_back30)s&quot; % self.subs)), InvalidSplit)
+
+
+    @inlineCallbacks
+    def test_calendarObjectSplit_splitat_too_new(self):
+        &quot;&quot;&quot;
+        Test that user triggered splitting of calendar objects does not work if split after last instance.
+        &quot;&quot;&quot;
+
+        yield self._setupSplitAt()
+
+        # Update it
+        cal = yield self.calendarUnderTest(name=&quot;calendar&quot;, home=&quot;user02&quot;)
+        cobjs = yield cal.calendarObjects()
+        self.assertEqual(len(cobjs), 1)
+        yield self.failUnlessFailure(cobjs[0].splitAt(DateTime.parseText(&quot;%(now_fwd25)s&quot; % self.subs)), InvalidSplit)
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretesttest_sql_externalpyfromrev12321CalendarServertrunktxdavcaldavdatastoretesttest_sql_externalpy"></a>
<div class="copfile"><h4>Copied: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_sql_external.py (from rev 12321, CalendarServer/trunk/txdav/caldav/datastore/test/test_sql_external.py) (0 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_sql_external.py                                (rev 0)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_sql_external.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -0,0 +1,682 @@
</span><ins>+##
+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+
+from twisted.internet.defer import inlineCallbacks
+
+from twext.python.clsprop import classproperty
+from txdav.common.datastore.test.util import populateCalendarsFrom
+from txdav.common.datastore.sql_tables import _BIND_MODE_READ, \
+    _BIND_STATUS_INVITED, _BIND_MODE_DIRECT, _BIND_STATUS_ACCEPTED
+from txdav.common.datastore.podding.test.util import MultiStoreConduitTest
+
+
+class BaseSharingTests(MultiStoreConduitTest):
+
+    &quot;&quot;&quot;
+    Test store-based calendar sharing.
+    &quot;&quot;&quot;
+
+    @inlineCallbacks
+    def setUp(self):
+        yield super(BaseSharingTests, self).setUp()
+        yield self.populate()
+
+
+    @inlineCallbacks
+    def populate(self):
+        yield populateCalendarsFrom(self.requirements, self.storeUnderTest())
+        self.notifierFactory.reset()
+
+    cal1 = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:uid1
+DTSTART:20131122T140000
+DURATION:PT1H
+CREATED:20060102T190000Z
+DTSTAMP:20051222T210507Z
+SUMMARY:event 1
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;
+
+    @classproperty(cache=False)
+    def requirements(cls): #@NoSelf
+        return {
+        &quot;user01&quot;: {
+            &quot;calendar&quot;: {
+                &quot;cal1.ics&quot;: (cls.cal1, None,),
+            },
+            &quot;inbox&quot;: {
+            },
+        },
+        &quot;user02&quot;: {
+            &quot;calendar&quot;: {
+            },
+            &quot;inbox&quot;: {
+            },
+        },
+        &quot;user03&quot;: {
+            &quot;calendar&quot;: {
+            },
+            &quot;inbox&quot;: {
+            },
+        },
+    }
+
+
+
+class CalendarSharing(BaseSharingTests):
+
+    @inlineCallbacks
+    def test_no_shares(self):
+        &quot;&quot;&quot;
+        Test that initially there are no shares.
+        &quot;&quot;&quot;
+
+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 0)
+        self.assertFalse(calendar.isShared())
+
+
+    @inlineCallbacks
+    def test_invite_sharee(self):
+        &quot;&quot;&quot;
+        Test invite/uninvite creates/removes shares and notifications.
+        &quot;&quot;&quot;
+
+        # Invite
+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 0)
+        self.assertFalse(calendar.isShared())
+
+        shareeView = yield calendar.inviteUserToShare(&quot;puser02&quot;, _BIND_MODE_READ, &quot;summary&quot;)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 1)
+        self.assertEqual(invites[0].uid, shareeView.shareUID())
+        self.assertEqual(invites[0].ownerUID, &quot;user01&quot;)
+        self.assertEqual(invites[0].shareeUID, &quot;puser02&quot;)
+        self.assertEqual(invites[0].mode, _BIND_MODE_READ)
+        self.assertEqual(invites[0].status, _BIND_STATUS_INVITED)
+        self.assertEqual(invites[0].summary, &quot;summary&quot;)
+
+        inviteUID = shareeView.shareUID()
+        sharedName = shareeView.name()
+
+        self.assertTrue(calendar.isShared())
+
+        yield self.commit()
+
+        shared = yield self.calendarUnderTest(txn=self.newOtherTransaction(), home=&quot;puser02&quot;, name=sharedName)
+        self.assertTrue(shared is None)
+
+        notifyHome = yield self.otherTransactionUnderTest().notificationsWithUID(&quot;puser02&quot;)
+        notifications = yield notifyHome.listNotificationObjects()
+        self.assertEqual(notifications, [inviteUID, ])
+        yield self.otherCommit()
+
+        # Uninvite
+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 1)
+
+        yield calendar.uninviteUserFromShare(&quot;puser02&quot;)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 0)
+
+        self.assertTrue(calendar.isShared())
+
+        yield self.commit()
+
+        notifyHome = yield self.otherTransactionUnderTest().notificationsWithUID(&quot;puser02&quot;)
+        notifications = yield notifyHome.listNotificationObjects()
+        self.assertEqual(notifications, [])
+        yield self.otherCommit()
+
+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        self.assertTrue(calendar.isShared())
+        yield calendar.setShared(False)
+        self.assertFalse(calendar.isShared())
+
+
+    @inlineCallbacks
+    def test_accept_share(self):
+        &quot;&quot;&quot;
+        Test that invite+accept creates shares and notifications.
+        &quot;&quot;&quot;
+
+        # Invite
+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 0)
+        self.assertFalse(calendar.isShared())
+
+        shareeView = yield calendar.inviteUserToShare(&quot;puser02&quot;, _BIND_MODE_READ, &quot;summary&quot;)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 1)
+
+        inviteUID = shareeView.shareUID()
+        sharedName = shareeView.name()
+
+        self.assertTrue(calendar.isShared())
+
+        yield self.commit()
+
+        shared = yield self.calendarUnderTest(txn=self.newOtherTransaction(), home=&quot;puser02&quot;, name=sharedName)
+        self.assertTrue(shared is None)
+
+        notifyHome = yield self.otherTransactionUnderTest().notificationsWithUID(&quot;puser02&quot;)
+        notifications = yield notifyHome.listNotificationObjects()
+        self.assertEqual(len(notifications), 1)
+        yield self.otherCommit()
+
+        # Accept
+        txn2 = self.newOtherTransaction()
+        shareeHome = yield self.homeUnderTest(txn=txn2, name=&quot;puser02&quot;)
+        yield shareeHome.acceptShare(inviteUID)
+
+        shared = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=sharedName)
+        self.assertTrue(shared is not None)
+        yield self.otherCommit()
+
+        notifyHome = yield self.transactionUnderTest().notificationsWithUID(&quot;user01&quot;)
+        notifications = yield notifyHome.listNotificationObjects()
+        self.assertEqual(notifications, [inviteUID + &quot;-reply&quot;, ])
+
+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        self.assertTrue(calendar.isShared())
+
+        yield self.commit()
+
+        # Re-accept
+        txn2 = self.newOtherTransaction()
+        shareeHome = yield self.homeUnderTest(txn=txn2, name=&quot;puser02&quot;)
+        yield shareeHome.acceptShare(inviteUID)
+
+        shared = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=sharedName)
+        self.assertTrue(shared is not None)
+        yield self.otherCommit()
+
+        notifyHome = yield self.transactionUnderTest().notificationsWithUID(&quot;user01&quot;)
+        notifications = yield notifyHome.listNotificationObjects()
+        self.assertEqual(notifications, [inviteUID + &quot;-reply&quot;, ])
+
+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        self.assertTrue(calendar.isShared())
+
+
+    @inlineCallbacks
+    def test_decline_share(self):
+        &quot;&quot;&quot;
+        Test that invite+decline does not create shares but does create notifications.
+        &quot;&quot;&quot;
+
+        # Invite
+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 0)
+        self.assertFalse(calendar.isShared())
+
+        shareeView = yield calendar.inviteUserToShare(&quot;puser02&quot;, _BIND_MODE_READ, &quot;summary&quot;)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 1)
+
+        inviteUID = shareeView.shareUID()
+        sharedName = shareeView.name()
+
+        self.assertTrue(calendar.isShared())
+
+        yield self.commit()
+
+        txn2 = self.newOtherTransaction()
+        shared = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=sharedName)
+        self.assertTrue(shared is None)
+
+        notifyHome = yield txn2.notificationsWithUID(&quot;puser02&quot;)
+        notifications = yield notifyHome.listNotificationObjects()
+        self.assertEqual(len(notifications), 1)
+        yield self.otherCommit()
+
+        # Decline
+        txn2 = self.newOtherTransaction()
+        shareeHome = yield self.homeUnderTest(txn=txn2, name=&quot;puser02&quot;)
+        yield shareeHome.declineShare(inviteUID)
+
+        shared = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=sharedName)
+        self.assertTrue(shared is None)
+        yield self.otherCommit()
+
+        notifyHome = yield self.transactionUnderTest().notificationsWithUID(&quot;user01&quot;)
+        notifications = yield notifyHome.listNotificationObjects()
+        self.assertEqual(notifications, [inviteUID + &quot;-reply&quot;, ])
+
+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        self.assertTrue(calendar.isShared())
+
+        yield self.commit()
+
+        # Redecline
+        txn2 = self.newOtherTransaction()
+        shareeHome = yield self.homeUnderTest(txn=txn2, name=&quot;puser02&quot;)
+        yield shareeHome.declineShare(inviteUID)
+
+        shared = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=sharedName)
+        self.assertTrue(shared is None)
+        yield self.otherCommit()
+
+        notifyHome = yield self.transactionUnderTest().notificationsWithUID(&quot;user01&quot;)
+        notifications = yield notifyHome.listNotificationObjects()
+        self.assertEqual(notifications, [inviteUID + &quot;-reply&quot;, ])
+
+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        self.assertTrue(calendar.isShared())
+
+
+    @inlineCallbacks
+    def test_accept_decline_share(self):
+        &quot;&quot;&quot;
+        Test that invite+accept/decline creates/removes shares and notifications.
+        Decline via the home.
+        &quot;&quot;&quot;
+
+        # Invite
+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 0)
+        self.assertFalse(calendar.isShared())
+
+        shareeView = yield calendar.inviteUserToShare(&quot;puser02&quot;, _BIND_MODE_READ, &quot;summary&quot;)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 1)
+        inviteUID = shareeView.shareUID()
+
+        sharedName = shareeView.name()
+
+        self.assertTrue(calendar.isShared())
+
+        yield self.commit()
+
+        txn2 = self.newOtherTransaction()
+        shared = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=sharedName)
+        self.assertTrue(shared is None)
+
+        notifyHome = yield txn2.notificationsWithUID(&quot;puser02&quot;)
+        notifications = yield notifyHome.listNotificationObjects()
+        self.assertEqual(len(notifications), 1)
+        yield self.otherCommit()
+
+        # Accept
+        txn2 = self.newOtherTransaction()
+        shareeHome = yield self.homeUnderTest(txn=txn2, name=&quot;puser02&quot;)
+        yield shareeHome.acceptShare(inviteUID)
+
+        shared = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=sharedName)
+        self.assertTrue(shared is not None)
+        yield self.otherCommit()
+
+        notifyHome = yield self.transactionUnderTest().notificationsWithUID(&quot;user01&quot;)
+        notifications = yield notifyHome.listNotificationObjects()
+        self.assertEqual(notifications, [inviteUID + &quot;-reply&quot;, ])
+
+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        self.assertTrue(calendar.isShared())
+
+        yield self.commit()
+
+        # Decline
+        txn2 = self.newOtherTransaction()
+        shareeHome = yield self.homeUnderTest(txn=txn2, name=&quot;puser02&quot;)
+        yield shareeHome.declineShare(inviteUID)
+
+        shared = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=sharedName)
+        self.assertTrue(shared is None)
+        yield self.otherCommit()
+
+        notifyHome = yield self.transactionUnderTest().notificationsWithUID(&quot;user01&quot;)
+        notifications = yield notifyHome.listNotificationObjects()
+        self.assertEqual(notifications, [inviteUID + &quot;-reply&quot;, ])
+
+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        self.assertTrue(calendar.isShared())
+
+
+    @inlineCallbacks
+    def test_accept_remove_share(self):
+        &quot;&quot;&quot;
+        Test that invite+accept/decline creates/removes shares and notifications.
+        Decline via the shared collection (removal).
+        &quot;&quot;&quot;
+
+        # Invite
+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 0)
+
+        shareeView = yield calendar.inviteUserToShare(&quot;puser02&quot;, _BIND_MODE_READ, &quot;summary&quot;)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 1)
+
+        inviteUID = shareeView.shareUID()
+        sharedName = shareeView.name()
+
+        yield self.commit()
+
+        txn2 = self.newOtherTransaction()
+        shared = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=sharedName)
+        self.assertTrue(shared is None)
+
+        notifyHome = yield txn2.notificationsWithUID(&quot;puser02&quot;)
+        notifications = yield notifyHome.listNotificationObjects()
+        self.assertEqual(len(notifications), 1)
+        yield self.otherCommit()
+
+        # Accept
+        txn2 = self.newOtherTransaction()
+        shareeHome = yield self.homeUnderTest(txn=txn2, name=&quot;puser02&quot;)
+        yield shareeHome.acceptShare(inviteUID)
+
+        shared = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=sharedName)
+        self.assertTrue(shared is not None)
+        yield self.otherCommit()
+
+        notifyHome = yield self.transactionUnderTest().notificationsWithUID(&quot;user01&quot;)
+        notifications = yield notifyHome.listNotificationObjects()
+        self.assertEqual(notifications, [inviteUID + &quot;-reply&quot;, ])
+
+        yield self.commit()
+
+        # Delete
+        txn2 = self.newOtherTransaction()
+        shared = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=sharedName)
+        yield shared.deleteShare()
+        yield self.otherCommit()
+
+        txn2 = self.newOtherTransaction()
+        shared = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=sharedName)
+        self.assertTrue(shared is None)
+        yield self.otherCommit()
+
+        notifyHome = yield self.transactionUnderTest().notificationsWithUID(&quot;user01&quot;)
+        notifications = yield notifyHome.listNotificationObjects()
+        self.assertEqual(notifications, [inviteUID + &quot;-reply&quot;, ])
+
+
+    @inlineCallbacks
+    def test_accept_remove_accept(self):
+        yield self.createShare()
+        yield self.removeShare()
+        shared_name = yield self.createShare()
+
+        txn2 = self.newOtherTransaction()
+        otherCal = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=shared_name)
+        self.assertTrue(otherCal is not None)
+        yield self.otherCommit()
+
+
+    @inlineCallbacks
+    def test_accept_remove_accept_newcalendar(self):
+        &quot;&quot;&quot;
+        Test that deleting and re-creating a share with the same sharer name works.
+        &quot;&quot;&quot;
+
+        home = yield self.homeUnderTest(name=&quot;user01&quot;, create=True)
+        yield home.createCalendarWithName(&quot;shared&quot;)
+        yield self.commit()
+
+        shared_name = yield self.createShare(name=&quot;shared&quot;)
+
+        txn2 = self.newOtherTransaction()
+        otherCal = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=shared_name)
+        self.assertTrue(otherCal is not None)
+        yield self.otherCommit()
+
+        yield self.removeShare(name=&quot;shared&quot;)
+        home = yield self.homeUnderTest(name=&quot;user01&quot;, create=True)
+        yield home.removeCalendarWithName(&quot;shared&quot;)
+        yield self.commit()
+
+        txn2 = self.newOtherTransaction()
+        otherCal = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=shared_name)
+        self.assertTrue(otherCal is None)
+        yield self.otherCommit()
+
+        home = yield self.homeUnderTest(name=&quot;user01&quot;, create=True)
+        yield home.createCalendarWithName(&quot;shared&quot;)
+        yield self.commit()
+
+        shared_name = yield self.createShare(name=&quot;shared&quot;)
+
+        txn2 = self.newOtherTransaction()
+        otherCal = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=shared_name)
+        self.assertTrue(otherCal is not None)
+        yield self.otherCommit()
+
+
+    @inlineCallbacks
+    def test_inviteProperties(self):
+
+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        yield calendar.setUsedForFreeBusy(True)
+        yield self.commit()
+
+        shared_name = yield self.createShare()
+
+        txn2 = self.newOtherTransaction()
+        shared = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=shared_name)
+        self.assertFalse(shared.isUsedForFreeBusy())
+
+
+    @inlineCallbacks
+    def test_direct_sharee(self):
+        &quot;&quot;&quot;
+        Test invite/uninvite creates/removes shares and notifications.
+        &quot;&quot;&quot;
+
+        # Invite
+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 0)
+        self.assertFalse(calendar.isShared())
+
+        shareeView = yield calendar.directShareWithUser(&quot;puser02&quot;)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 1)
+        self.assertEqual(invites[0].uid, shareeView.shareUID())
+        self.assertEqual(invites[0].ownerUID, &quot;user01&quot;)
+        self.assertEqual(invites[0].shareeUID, &quot;puser02&quot;)
+        self.assertEqual(invites[0].mode, _BIND_MODE_DIRECT)
+        self.assertEqual(invites[0].status, _BIND_STATUS_ACCEPTED)
+
+        sharedName = shareeView.name()
+
+        yield self.commit()
+
+        txn2 = self.newOtherTransaction()
+        shared = yield self.calendarUnderTest(txn=txn2, home=&quot;user02&quot;, name=sharedName)
+        self.assertTrue(shared is not None)
+
+        notifyHome = yield txn2.notificationsWithUID(&quot;user02&quot;)
+        notifications = yield notifyHome.listNotificationObjects()
+        self.assertEqual(len(notifications), 0)
+        yield self.otherCommit()
+
+        # Remove
+        txn2 = self.newOtherTransaction()
+        shared = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=sharedName)
+        yield shared.deleteShare()
+        yield self.otherCommit()
+
+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 0)
+
+        notifyHome = yield self.transactionUnderTest().notificationsWithUID(&quot;user01&quot;)
+        notifications = yield notifyHome.listNotificationObjects()
+        self.assertEqual(len(notifications), 0)
+
+    test_direct_sharee.skip = True
+
+    @inlineCallbacks
+    def test_sharedNotifierID(self):
+        shared_name = yield self.createShare()
+
+        home = yield self.homeUnderTest(name=&quot;user01&quot;)
+        self.assertEquals(home.notifierID(), (&quot;CalDAV&quot;, &quot;user01&quot;,))
+        calendar = yield home.calendarWithName(&quot;calendar&quot;)
+        self.assertEquals(calendar.notifierID(), (&quot;CalDAV&quot;, &quot;user01/calendar&quot;,))
+        yield self.commit()
+
+        txn2 = self.newOtherTransaction()
+        home = yield self.homeUnderTest(txn=txn2, name=&quot;puser02&quot;)
+        self.assertEquals(home.notifierID(), (&quot;CalDAV&quot;, &quot;puser02&quot;,))
+        calendar = yield home.calendarWithName(shared_name)
+        self.assertEquals(calendar.notifierID(), (&quot;CalDAV&quot;, &quot;user01/calendar&quot;,))
+
+
+    @inlineCallbacks
+    def test_sharedWithTwo(self):
+        shared_name1 = yield self.createShare(shareeGUID=&quot;puser02&quot;)
+        shared_name2 = yield self.createShare(shareeGUID=&quot;puser03&quot;)
+
+        txn2 = self.newOtherTransaction()
+        otherCal = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=shared_name1)
+        self.assertTrue(otherCal is not None)
+        yield self.otherCommit()
+
+        txn2 = self.newOtherTransaction()
+        otherCal = yield self.calendarUnderTest(txn=txn2, home=&quot;puser03&quot;, name=shared_name2)
+        self.assertTrue(otherCal is not None)
+        yield self.otherCommit()
+
+
+
+class SharingRevisions(BaseSharingTests):
+    &quot;&quot;&quot;
+    Test store-based sharing and interaction with revision table.
+    &quot;&quot;&quot;
+
+    @inlineCallbacks
+    def test_shareWithRevision(self):
+        &quot;&quot;&quot;
+        Verify that bindRevision on calendars and shared calendars has the correct value.
+        &quot;&quot;&quot;
+        sharedName = yield self.createShare()
+
+        normalCal = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        self.assertEqual(normalCal._bindRevision, 0)
+
+        txn2 = self.newOtherTransaction()
+        otherCal = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=sharedName)
+        self.assertNotEqual(otherCal._bindRevision, 0)
+
+
+    @inlineCallbacks
+    def test_updateShareRevision(self):
+        &quot;&quot;&quot;
+        Verify that bindRevision on calendars and shared calendars has the correct value.
+        &quot;&quot;&quot;
+        # Invite
+        calendar = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 0)
+
+        shareeView = yield calendar.inviteUserToShare(&quot;puser02&quot;, _BIND_MODE_READ, &quot;summary&quot;)
+        newCalName = shareeView.shareUID()
+        yield self.commit()
+
+        normalCal = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        self.assertEqual(normalCal._bindRevision, 0)
+        yield self.commit()
+
+        txn2 = self.newOtherTransaction()
+        otherHome = yield self.homeUnderTest(txn=txn2, name=&quot;puser02&quot;)
+        otherCal = yield otherHome.anyObjectWithShareUID(newCalName)
+        self.assertEqual(otherCal._bindRevision, 0)
+        yield self.otherCommit()
+
+        txn2 = self.newOtherTransaction()
+        shareeHome = yield self.homeUnderTest(txn=txn2, name=&quot;puser02&quot;)
+        shareeView = yield shareeHome.acceptShare(newCalName)
+        sharedName = shareeView.name()
+        yield self.otherCommit()
+
+        normalCal = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        self.assertEqual(normalCal._bindRevision, 0)
+
+        txn2 = self.newOtherTransaction()
+        otherCal = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=sharedName)
+        self.assertNotEqual(otherCal._bindRevision, 0)
+
+
+    @inlineCallbacks
+    def test_sharedRevisions(self):
+        &quot;&quot;&quot;
+        Verify that resourceNamesSinceRevision returns all resources after initial bind and sync.
+        &quot;&quot;&quot;
+        sharedName = yield self.createShare()
+
+        normalCal = yield self.calendarUnderTest(home=&quot;user01&quot;, name=&quot;calendar&quot;)
+        self.assertEqual(normalCal._bindRevision, 0)
+
+        txn2 = self.newOtherTransaction()
+        otherHome = yield self.homeUnderTest(txn=txn2, name=&quot;puser02&quot;)
+        otherCal = yield self.calendarUnderTest(txn=txn2, home=&quot;puser02&quot;, name=sharedName)
+        self.assertNotEqual(otherCal._bindRevision, 0)
+
+        sync_token = yield otherCal.syncToken()
+        revision = otherCal.revisionFromToken(sync_token)
+
+        changed, deleted, invalid = yield otherCal.resourceNamesSinceRevision(0)
+        self.assertNotEqual(len(changed), 0)
+        self.assertEqual(len(deleted), 0)
+        self.assertEqual(len(invalid), 0)
+
+        changed, deleted, invalid = yield otherCal.resourceNamesSinceRevision(revision)
+        self.assertEqual(len(changed), 0)
+        self.assertEqual(len(deleted), 0)
+        self.assertEqual(len(invalid), 0)
+
+        sync_token = yield otherHome.syncToken()
+        revision = otherHome.revisionFromToken(sync_token)
+
+        for depth in (&quot;1&quot;, &quot;infinity&quot;,):
+            changed, deleted, invalid = yield otherHome.resourceNamesSinceRevision(revision - 1, depth)
+            self.assertEqual(len(changed), 0 if depth == &quot;infinity&quot; else 1)
+            self.assertEqual(len(deleted), 0)
+            self.assertEqual(len(invalid), 1 if depth == &quot;infinity&quot; else 0)
+
+            changed, deleted, invalid = yield otherHome.resourceNamesSinceRevision(revision, depth)
+            self.assertEqual(len(changed), 0)
+            self.assertEqual(len(deleted), 0)
+            self.assertEqual(len(invalid), 1 if depth == &quot;infinity&quot; else 0)
+
+        yield self.otherCommit()
+
+        yield self.removeShare()
+
+        txn2 = self.newOtherTransaction()
+        otherHome = yield self.homeUnderTest(txn=txn2, name=&quot;puser02&quot;)
+
+        for depth in (&quot;1&quot;, &quot;infinity&quot;,):
+            changed, deleted, invalid = yield otherHome.resourceNamesSinceRevision(revision, depth)
+            self.assertEqual(len(changed), 0)
+            self.assertEqual(len(deleted), 1)
+            self.assertEqual(len(invalid), 0)
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretesttest_sql_sharingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_sql_sharing.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_sql_sharing.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_sql_sharing.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -554,13 +554,15 @@
</span><span class="cx">         otherCal = yield self.calendarUnderTest(home=&quot;user02&quot;, name=sharedName)
</span><span class="cx">         self.assertNotEqual(otherCal._bindRevision, 0)
</span><span class="cx"> 
</span><del>-        changed, deleted = yield otherCal.resourceNamesSinceRevision(0)
</del><ins>+        changed, deleted, invalid = yield otherCal.resourceNamesSinceRevision(0)
</ins><span class="cx">         self.assertNotEqual(len(changed), 0)
</span><span class="cx">         self.assertEqual(len(deleted), 0)
</span><ins>+        self.assertEqual(len(invalid), 0)
</ins><span class="cx"> 
</span><del>-        changed, deleted = yield otherCal.resourceNamesSinceRevision(otherCal._bindRevision)
</del><ins>+        changed, deleted, invalid = yield otherCal.resourceNamesSinceRevision(otherCal._bindRevision)
</ins><span class="cx">         self.assertEqual(len(changed), 0)
</span><span class="cx">         self.assertEqual(len(deleted), 0)
</span><ins>+        self.assertEqual(len(invalid), 0)
</ins><span class="cx"> 
</span><span class="cx">         for depth, result in (
</span><span class="cx">             (&quot;1&quot;, [otherCal.name() + '/',
</span><span class="lines">@@ -572,10 +574,12 @@
</span><span class="cx">                          'calendar/',
</span><span class="cx">                          'inbox/'],
</span><span class="cx">              )):
</span><del>-            changed, deleted = yield otherHome.resourceNamesSinceRevision(0, depth)
</del><ins>+            changed, deleted, invalid = yield otherHome.resourceNamesSinceRevision(0, depth)
</ins><span class="cx">             self.assertEqual(set(changed), set(result))
</span><span class="cx">             self.assertEqual(len(deleted), 0)
</span><ins>+            self.assertEqual(len(invalid), 0)
</ins><span class="cx"> 
</span><del>-            changed, deleted = yield otherHome.resourceNamesSinceRevision(otherCal._bindRevision, depth)
</del><ins>+            changed, deleted, invalid = yield otherHome.resourceNamesSinceRevision(otherCal._bindRevision, depth)
</ins><span class="cx">             self.assertEqual(len(changed), 0)
</span><span class="cx">             self.assertEqual(len(deleted), 0)
</span><ins>+            self.assertEqual(len(invalid), 0)
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretesttest_utilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/test_util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -13,7 +13,6 @@
</span><span class="cx"> # See the License for the specific language governing permissions and
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><del>-from txdav.caldav.datastore.test.util import buildCalendarStore
</del><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> Tests for txdav.caldav.datastore.util.
</span><span class="lines">@@ -30,6 +29,7 @@
</span><span class="cx"> from twistedcaldav.test.util import TestCase
</span><span class="cx"> 
</span><span class="cx"> from txdav.common.datastore.test.util import populateCalendarsFrom, CommonCommonTests
</span><ins>+from txdav.caldav.datastore.test.util import buildCalendarStore
</ins><span class="cx"> 
</span><span class="cx"> from txdav.caldav.datastore.util import dropboxIDFromCalendarObject, \
</span><span class="cx">     StorageTransportBase, migrateHome
</span><span class="lines">@@ -323,7 +323,12 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(HomeMigrationTests, self).setUp()
</span><del>-        self.theStore = yield buildCalendarStore(self, self.notifierFactory, homes=(&quot;conflict1&quot;, &quot;conflict2&quot;,))
</del><ins>+        self.theStore = yield buildCalendarStore(self, self.notifierFactory, homes=(
+            &quot;conflict1&quot;,
+            &quot;conflict2&quot;,
+            &quot;empty_home&quot;,
+            &quot;non_empty_home&quot;,
+        ))
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def storeUnderTest(self):
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoretestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/test/util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.carddav.datastore.test -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -62,18 +62,13 @@
</span><span class="cx">         calendarUserAddresses,
</span><span class="cx">         cutype=&quot;INDIVIDUAL&quot;,
</span><span class="cx">         thisServer=True,
</span><ins>+        server=None,
</ins><span class="cx">         extras={},
</span><span class="cx">     ):
</span><span class="cx"> 
</span><del>-        super(TestCalendarStoreDirectoryRecord, self).__init__(uid, shortNames,
-            fullName, extras=extras)
-        self.uid = uid
-        self.shortNames = shortNames
-        self.fullName = fullName
-        self.displayName = self.fullName if self.fullName else self.shortNames[0]
</del><ins>+        super(TestCalendarStoreDirectoryRecord, self).__init__(uid, shortNames, fullName, thisServer, server, extras=extras)
</ins><span class="cx">         self.calendarUserAddresses = calendarUserAddresses
</span><span class="cx">         self.cutype = cutype
</span><del>-        self._thisServer = thisServer
</del><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def canonicalCalendarUserAddress(self):
</span><span class="lines">@@ -92,10 +87,6 @@
</span><span class="cx">         return cua
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def thisServer(self):
-        return self._thisServer
-
-
</del><span class="cx">     def calendarsEnabled(self):
</span><span class="cx">         return True
</span><span class="cx"> 
</span><span class="lines">@@ -150,12 +141,19 @@
</span><span class="cx">     homes.update((
</span><span class="cx">         &quot;home1&quot;,
</span><span class="cx">         &quot;home2&quot;,
</span><del>-        &quot;Home_attachments&quot;,
</del><ins>+        &quot;home3&quot;,
+        &quot;home_attachments&quot;,
</ins><span class="cx">         &quot;home_bad&quot;,
</span><span class="cx">         &quot;home_defaults&quot;,
</span><span class="cx">         &quot;home_no_splits&quot;,
</span><ins>+        &quot;home_provision1&quot;,
+        &quot;home_provision2&quot;,
</ins><span class="cx">         &quot;home_splits&quot;,
</span><span class="cx">         &quot;home_splits_shared&quot;,
</span><ins>+        &quot;uid1&quot;,
+        &quot;uid2&quot;,
+        &quot;new-home&quot;,
+        &quot;xyzzy&quot;,
</ins><span class="cx">     ))
</span><span class="cx">     for uid in homes:
</span><span class="cx">         directory.addRecord(buildDirectoryRecord(uid))
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavdatastoreutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/datastore/util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.caldav.datastore.test.test_util -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavicalendardirectoryservicepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/icalendardirectoryservice.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/icalendardirectoryservice.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/icalendardirectoryservice.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -60,14 +60,6 @@
</span><span class="cx">         @rtype: C{str}
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-    def thisServer(): #@NoSelf
-        &quot;&quot;&quot;
-        Indicates whether the record is hosted on this server &quot;pod&quot;.
-
-        @return: C{True} if hosted by this service.
-        @rtype: C{bool}
-        &quot;&quot;&quot;
-
</del><span class="cx">     def calendarsEnabled(): #@NoSelf
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Indicates whether the record enabled for using the calendar service.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavicalendarstorepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/icalendarstore.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/icalendarstore.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/icalendarstore.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.caldav.datastore -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -843,6 +843,13 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+class InvalidSplit(CommonStoreError):
+    &quot;&quot;&quot;
+    A user triggered split operation is invalid.
+    &quot;&quot;&quot;
+
+
+
</ins><span class="cx"> #
</span><span class="cx"> # FIXME: These may belong elsewhere.
</span><span class="cx"> #
</span><span class="lines">@@ -907,7 +914,7 @@
</span><span class="cx">     NORMAL_NO_IMPLICIT -    this is an application layer (user) generated remove that deliberately turns
</span><span class="cx">                             off implicit scheduling operations.
</span><span class="cx"> 
</span><del>-    INTERNAL -              remove the resource without implicit scheduling.
</del><ins>+    INTERNAL -              remove the resource without implicit scheduling or attachment processing.
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">     NORMAL = NamedConstant()
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcaldavresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/resource.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/resource.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/caldav/resource.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcarddav__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastore__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastorefilepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/file.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/file.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/file.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.carddav.datastore.test.test_file -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoreindex_filepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/index_file.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/index_file.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/index_file.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -37,10 +37,6 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import maybeDeferred
</span><span class="cx"> 
</span><del>-from twistedcaldav import carddavxml
-from txdav.common.icommondatastore import SyncTokenValidException, \
-    ReservationError
-from twistedcaldav.query import addressbookquery
</del><span class="cx"> from twistedcaldav.sql import AbstractSQLDatabase
</span><span class="cx"> from twistedcaldav.sql import db_prefix
</span><span class="cx"> from twistedcaldav.vcard import Component
</span><span class="lines">@@ -49,6 +45,12 @@
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twistedcaldav.memcachepool import CachePoolUserMixIn
</span><span class="cx"> 
</span><ins>+from txdav.carddav.datastore.query.builder import buildExpression
+from txdav.carddav.datastore.query.filter import Filter
+from txdav.common.datastore.query.filegenerator import sqllitegenerator
+from txdav.common.icommondatastore import SyncTokenValidException, \
+    ReservationError
+
</ins><span class="cx"> log = Logger()
</span><span class="cx"> 
</span><span class="cx"> db_basename = db_prefix + &quot;sqlite&quot;
</span><span class="lines">@@ -218,6 +220,24 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+def sqladdressbookquery(filter, addressbookid=None):
+    &quot;&quot;&quot;
+    Convert the supplied addressbook-query into a partial SQL statement.
+
+    @param filter: the L{Filter} for the addressbook-query to convert.
+    @return: a C{tuple} of (C{str}, C{list}), where the C{str} is the partial SQL statement,
+            and the C{list} is the list of argument substitutions to use with the SQL API execute method.
+            Or return C{None} if it is not possible to create an SQL query to fully match the addressbook-query.
+    &quot;&quot;&quot;
+    try:
+        expression = buildExpression(filter, sqllitegenerator.FIELDS)
+        sql = sqllitegenerator(expression, addressbookid, None)
+        return sql.generate()
+    except ValueError:
+        return None
+
+
+
</ins><span class="cx"> class AddressBookIndex(AbstractSQLDatabase):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     AddressBook collection index abstract base class that defines the apis for the index.
</span><span class="lines">@@ -410,6 +430,7 @@
</span><span class="cx"> 
</span><span class="cx">         changed = []
</span><span class="cx">         deleted = []
</span><ins>+        invalid = []
</ins><span class="cx">         for name, wasdeleted in results:
</span><span class="cx">             if name:
</span><span class="cx">                 if wasdeleted == 'Y':
</span><span class="lines">@@ -420,7 +441,7 @@
</span><span class="cx">             else:
</span><span class="cx">                 raise SyncTokenValidException
</span><span class="cx"> 
</span><del>-        return changed, deleted,
</del><ins>+        return (changed, deleted, invalid)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def lastRevision(self):
</span><span class="lines">@@ -445,8 +466,8 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def searchValid(self, filter):
</span><del>-        if isinstance(filter, carddavxml.Filter):
-            qualifiers = addressbookquery.sqladdressbookquery(filter)
</del><ins>+        if isinstance(filter, Filter):
+            qualifiers = sqladdressbookquery(filter)
</ins><span class="cx">         else:
</span><span class="cx">             qualifiers = None
</span><span class="cx"> 
</span><span class="lines">@@ -466,8 +487,8 @@
</span><span class="cx">         # start caching...
</span><span class="cx"> 
</span><span class="cx">         # Make sure we have a proper Filter element and get the partial SQL statement to use.
</span><del>-        if isinstance(filter, carddavxml.Filter):
-            qualifiers = addressbookquery.sqladdressbookquery(filter)
</del><ins>+        if isinstance(filter, Filter):
+            qualifiers = sqladdressbookquery(filter)
</ins><span class="cx">         else:
</span><span class="cx">             qualifiers = None
</span><span class="cx">         if qualifiers is not None:
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoresqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/sql.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/sql.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/sql.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> # #
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -14,8 +14,8 @@
</span><span class="cx"> # See the License for the specific language governing permissions and
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> # #
</span><del>-from txdav.xml import element
</del><span class="cx"> 
</span><ins>+
</ins><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> SQL backend for CardDAV storage.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="lines">@@ -47,12 +47,14 @@
</span><span class="cx"> 
</span><span class="cx"> from txdav.base.propertystore.base import PropertyName
</span><span class="cx"> from txdav.base.propertystore.sql import PropertyStore
</span><ins>+from txdav.carddav.datastore.query.builder import buildExpression
+from txdav.carddav.datastore.query.filter import Filter
</ins><span class="cx"> from txdav.carddav.iaddressbookstore import IAddressBookHome, IAddressBook, \
</span><span class="cx">     IAddressBookObject, GroupWithUnsharedAddressNotAllowedError, \
</span><span class="cx">     KindChangeNotAllowedError
</span><ins>+from txdav.common.datastore.query.generator import SQLQueryGenerator
</ins><span class="cx"> from txdav.common.datastore.sql import CommonHome, CommonHomeChild, \
</span><span class="cx">     CommonObjectResource, EADDRESSBOOKTYPE, SharingMixIn, SharingInvitation
</span><del>-from txdav.common.datastore.sql_legacy import PostgresLegacyABIndexEmulator
</del><span class="cx"> from txdav.common.datastore.sql_tables import _ABO_KIND_PERSON, \
</span><span class="cx">     _ABO_KIND_GROUP, _ABO_KIND_RESOURCE, _ABO_KIND_LOCATION, schema, \
</span><span class="cx">     _BIND_MODE_OWN, _BIND_MODE_WRITE, _BIND_STATUS_ACCEPTED, \
</span><span class="lines">@@ -61,7 +63,8 @@
</span><span class="cx">     InvalidUIDError, UIDExistsError, ObjectResourceTooBigError, \
</span><span class="cx">     InvalidObjectResourceError, InvalidComponentForStoreError, \
</span><span class="cx">     AllRetriesFailed, ObjectResourceNameAlreadyExistsError, \
</span><del>-    SyncTokenValidException
</del><ins>+    SyncTokenValidException, IndexedSearchException
+from txdav.xml import element
</ins><span class="cx"> 
</span><span class="cx"> from zope.interface.declarations import implements
</span><span class="cx"> 
</span><span class="lines">@@ -86,7 +89,6 @@
</span><span class="cx"> 
</span><span class="cx">     def __init__(self, transaction, ownerUID):
</span><span class="cx"> 
</span><del>-        self._childClass = AddressBook
</del><span class="cx">         super(AddressBookHome, self).__init__(transaction, ownerUID)
</span><span class="cx">         self._addressbookPropertyStoreID = None
</span><span class="cx">         self._addressbook = None
</span><span class="lines">@@ -450,6 +452,8 @@
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     implements(IAddressBook)
</span><span class="cx"> 
</span><ins>+    _homeType = EADDRESSBOOKTYPE
+
</ins><span class="cx">     # structured tables.  (new, preferred)
</span><span class="cx">     _homeSchema = schema.ADDRESSBOOK_HOME
</span><span class="cx">     _bindSchema = schema.SHARED_ADDRESSBOOK_BIND
</span><span class="lines">@@ -458,14 +462,87 @@
</span><span class="cx">     _revisionsSchema = schema.ADDRESSBOOK_OBJECT_REVISIONS
</span><span class="cx">     _objectSchema = schema.ADDRESSBOOK_OBJECT
</span><span class="cx"> 
</span><ins>+    # Mapping of vCard property name to DB column name
+    _queryFields = {
+        &quot;UID&quot;: _objectSchema.UID,
+    }
</ins><span class="cx"> 
</span><del>-    def __init__(self, home, name, resourceID, mode, status, revision=0, message=None, ownerHome=None, ownerName=None):
</del><ins>+
+    @classmethod
+    @inlineCallbacks
+    def _getDBDataIndirect(cls, home, name, resourceID, externalID):
+
+        # Get the bind row data
+        row = None
+
+        # TODO: query cacher
+
+        rows = None
+        ownerHome = None
+
+        # TODO: add queryCacher support
+
+        if rows is None:
+            # No cached copy
+            if name:
+                ownerHome = yield home._txn.addressbookHomeWithUID(name)
+                if ownerHome is None:
+                    returnValue(None)
+                resourceID = ownerHome.addressbook()._resourceID
+            rows = yield AddressBookObject._bindForHomeIDAndAddressBookID.on(
+                home._txn, homeID=home._resourceID, addressbookID=resourceID
+            )
+
+        if not rows:
+            returnValue(None)
+
+        groupID = None
+        overallBindStatus = _BIND_STATUS_INVITED
+        minBindRevision = None
+        for row in rows:
+            bindMode, homeID, resourceGroupID, externalID, name, bindStatus, bindRevision, bindMessage = row[:cls.bindColumnCount] #@UnusedVariable
+            if groupID is None:
+                groupID = resourceGroupID
+            minBindRevision = min(minBindRevision, bindRevision) if minBindRevision is not None else bindRevision
+            if bindStatus == _BIND_STATUS_ACCEPTED:
+                overallBindStatus = _BIND_STATUS_ACCEPTED
+
+        if ownerHome is None:
+            ownerAddressBookID = yield AddressBookObject.ownerAddressBookIDFromGroupID(home._txn, groupID)
+            ownerHome = yield home.ownerHomeWithChildID(ownerAddressBookID)
+
+        bindData = row[:cls.bindColumnCount]
+        additionalBindData = row[cls.bindColumnCount:cls.bindColumnCount + len(cls.additionalBindColumns())]
+
+        # Adjust for aggregate values
+        bindData[cls.bindColumns().index(cls._bindSchema.RESOURCE_ID)] = resourceID
+        bindData[cls.bindColumns().index(cls._bindSchema.RESOURCE_NAME)] = ownerHome.uid()
+        bindData[cls.bindColumns().index(cls._bindSchema.BIND_MODE)] = _BIND_MODE_INDIRECT
+        bindData[cls.bindColumns().index(cls._bindSchema.BIND_STATUS)] = overallBindStatus
+        bindData[cls.bindColumns().index(cls._bindSchema.BIND_REVISION)] = minBindRevision
+        bindData[cls.bindColumns().index(cls._bindSchema.MESSAGE)] = &quot;&quot;
+
+        # Get the matching metadata data
+        metadataData = None
+        queryCacher = home._txn._queryCacher
+        if queryCacher:
+            # Retrieve from cache
+            cacheKey = queryCacher.keyForHomeChildMetaData(resourceID)
+            metadataData = yield queryCacher.get(cacheKey)
+
+        if metadataData is None:
+            # No cached copy
+            metadataData = (yield cls._metadataByIDQuery.on(home._txn, resourceID=resourceID))[0]
+            if queryCacher:
+                # Cache the results
+                yield queryCacher.setAfterCommit(home._txn, cacheKey, metadataData)
+
+        returnValue((bindData, additionalBindData, metadataData, ownerHome,))
+
+
+    def __init__(self, home, name, resourceID, mode, status, revision=0, message=None, ownerHome=None, ownerName=None, externalID=None):
</ins><span class="cx">         ownerName = ownerHome.addressbook().name() if ownerHome else None
</span><del>-        super(AddressBook, self).__init__(
-            home, name, resourceID, mode, status, revision=revision,
-            message=message, ownerHome=ownerHome, ownerName=ownerName
-        )
-        self._index = PostgresLegacyABIndexEmulator(self)
</del><ins>+        super(AddressBook, self).__init__(home, name, resourceID, mode, status, revision=revision, message=message, ownerHome=ownerHome, ownerName=ownerName, externalID=externalID)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def __repr__(self):
</span><span class="lines">@@ -579,13 +656,14 @@
</span><span class="cx">                 raise SyncTokenValidException
</span><span class="cx"> 
</span><span class="cx">         # call sharedChildResourceNamesSinceRevision() and filter results
</span><del>-        sharedChildChanged, sharedChildDeleted = yield self.sharedChildResourceNamesSinceRevision(revision, &quot;infinity&quot;)
</del><ins>+        sharedChildChanged, sharedChildDeleted, sharedChildInvalid = yield self.sharedChildResourceNamesSinceRevision(revision, &quot;infinity&quot;)
</ins><span class="cx"> 
</span><span class="cx">         selfPath = self.name() + '/'
</span><span class="cx">         lenpath = len(selfPath)
</span><span class="cx">         changed = [item[lenpath:] for item in sharedChildChanged if item.startswith(selfPath) and item != selfPath]
</span><span class="cx">         deleted = [item[lenpath:] for item in sharedChildDeleted if item.startswith(selfPath) and item != selfPath]
</span><del>-        returnValue((changed, deleted,))
</del><ins>+        invalid = [item[lenpath:] for item in sharedChildInvalid if item.startswith(selfPath) and item != selfPath]
+        returnValue((changed, deleted, invalid))
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -622,7 +700,7 @@
</span><span class="cx">                 self._txn, homeID=self._home._resourceID, addressbookID=self._resourceID
</span><span class="cx">         )
</span><span class="cx">         if groupBindRows:
</span><del>-            bindRevisions += [groupBindRow[5] for groupBindRow in groupBindRows]
</del><ins>+            bindRevisions += [groupBindRow[self.bindColumns().index(self._bindSchema.BIND_REVISION)] for groupBindRow in groupBindRows]
</ins><span class="cx"> 
</span><span class="cx">         if revision != 0 and revision &lt; max(bindRevisions):
</span><span class="cx">             if depth != '1':
</span><span class="lines">@@ -634,20 +712,17 @@
</span><span class="cx"> 
</span><span class="cx">         if self.fullyShared():
</span><span class="cx">             # add change for addressbook group
</span><del>-            changed, deleted = yield super(AddressBook, self).sharedChildResourceNamesSinceRevision(revision, depth)
</del><ins>+            changed, deleted, invalid = yield super(AddressBook, self).sharedChildResourceNamesSinceRevision(revision, depth)
</ins><span class="cx"> 
</span><del>-            #===================================================================
-            # # Add the following to add the addressbook group in sync report:
-            #
-            # if changed and depth != &quot;1&quot;:
-            #     changed.add(&quot;%s/%s&quot; % (path, self._groupForSharedAddressBookName(),))
-            #===================================================================
</del><ins>+            if revision == 0 and depth != &quot;1&quot;:
+                changed.add(&quot;%s/%s&quot; % (path, self._groupForSharedAddressBookName(),))
</ins><span class="cx"> 
</span><del>-            returnValue((changed, deleted))
</del><ins>+            returnValue((changed, deleted, invalid))
</ins><span class="cx"> 
</span><span class="cx">         changed = set()
</span><span class="cx">         deleted = set()
</span><del>-        acceptedGroupIDs = set([groupBindRow[2] for groupBindRow in groupBindRows])
</del><ins>+        invalid = set()
+        acceptedGroupIDs = set([groupBindRow[self.bindColumns().index(self._bindSchema.RESOURCE_ID)] for groupBindRow in groupBindRows])
</ins><span class="cx"> 
</span><span class="cx">         allowedObjectIDs = set((yield self.expandGroupIDs(self._txn, acceptedGroupIDs)))
</span><span class="cx">         oldAllowedObjectIDs = set((yield self.expandGroupIDs(self._txn, acceptedGroupIDs, revision))) if revision else set()
</span><span class="lines">@@ -719,7 +794,7 @@
</span><span class="cx">                 for addedObjectID in allowedObjectIDs:
</span><span class="cx">                     changed.add(&quot;%s/%s&quot; % (path, idToNameMap[addedObjectID],))
</span><span class="cx"> 
</span><del>-        returnValue((changed, deleted))
</del><ins>+        returnValue((changed, deleted, invalid,))
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -747,6 +822,37 @@
</span><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def getInviteCopyProperties(self):
+        &quot;&quot;&quot;
+        Get a dictionary of property name/values (as strings) for properties that are shadowable and
+        need to be copied to a sharee's collection when an external (cross-pod) share is created.
+        Sub-classes should override to expose the properties they care about.
+        &quot;&quot;&quot;
+        props = {}
+        for elem in (element.DisplayName, carddavxml.AddressBookDescription,):
+            if PropertyName.fromElement(elem) in self.properties():
+                props[elem.sname()] = str(self.properties()[PropertyName.fromElement(elem)])
+        return props
+
+
+    def setInviteCopyProperties(self, props):
+        &quot;&quot;&quot;
+        Copy a set of shadowable properties (as name/value strings) onto this shared resource when
+        a cross-pod invite is processed. Sub-classes should override to expose the properties they
+        care about.
+        &quot;&quot;&quot;
+        # Initialize these for all shares
+        for elem in (carddavxml.AddressBookDescription,):
+            if PropertyName.fromElement(elem) not in self.properties() and elem.sname() in props:
+                self.properties()[PropertyName.fromElement(elem)] = elem.fromString(props[elem.sname()])
+
+        # Only initialize these for direct shares
+        if self.direct():
+            for elem in (element.DisplayName,):
+                if PropertyName.fromElement(elem) not in self.properties() and elem.sname() in props:
+                    self.properties()[PropertyName.fromElement(elem)] = elem.fromString(props[elem.sname()])
+
+
</ins><span class="cx">     def contentType(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         The content type of addressbook objects is text/vcard.
</span><span class="lines">@@ -755,7 +861,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @classmethod
</span><del>-    def create(cls, home, name):
</del><ins>+    def create(cls, home, name, externalID=None):
</ins><span class="cx">         if name == home.addressbook().name():
</span><span class="cx">             # raise HomeChildNameAlreadyExistsError
</span><span class="cx">             pass
</span><span class="lines">@@ -781,13 +887,15 @@
</span><span class="cx">     def remove(self):
</span><span class="cx"> 
</span><span class="cx">         if self._resourceID == self._home._resourceID:
</span><ins>+
+            # Stop sharing first
+            yield self.ownerDeleteShare()
+
</ins><span class="cx">             # Allow remove, as a way to reset the address book to an empty state
</span><span class="cx">             for abo in (yield self.objectResources()):
</span><span class="cx">                 yield abo.remove()
</span><span class="cx">                 yield self.removedObjectResource(abo)
</span><span class="cx"> 
</span><del>-            yield self.unshare()  # storebridge should already have done this
-
</del><span class="cx">             yield self.properties()._removeResource()
</span><span class="cx">             yield self._loadPropertyStore()
</span><span class="cx"> 
</span><span class="lines">@@ -944,6 +1052,57 @@
</span><span class="cx">             returnValue((yield super(AddressBook, self).bumpModified()))
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
+    def search(self, filter):
+        &quot;&quot;&quot;
+        Finds resources matching the given qualifiers.
+        @param filter: the L{Filter} for the addressbook-query to execute.
+        @return: an iterable of tuples for each resource matching the
+            given C{qualifiers}. The tuples are C{(name, uid)}, where
+            C{name} is the resource name, C{uid} is the resource UID.
+        &quot;&quot;&quot;
+
+        # We might be passed an L{Filter} or a serialization of one
+        if isinstance(filter, dict):
+            try:
+                filter = Filter.deserialize(filter)
+            except Exception:
+                filter = None
+
+        # Make sure we have a proper Filter element and get the partial SQL statement to use.
+        sql_stmt = self._sqlquery(filter)
+
+        # No result means it is too complex for us
+        if sql_stmt is None:
+            raise IndexedSearchException()
+
+        sql_stmt, args = sql_stmt
+        rowiter = yield sql_stmt.on(self._txn, **args)
+
+        returnValue(list(rowiter))
+
+
+    def _sqlquery(self, filter):
+        &quot;&quot;&quot;
+        Convert the supplied addressbook-query into a partial SQL statement.
+
+        @param filter: the L{Filter} for the addressbook-query to convert.
+        @return: a C{tuple} of (C{str}, C{list}), where the C{str} is the partial SQL statement,
+                and the C{list} is the list of argument substitutions to use with the SQL API execute method.
+                Or return C{None} if it is not possible to create an SQL query to fully match the addressbook-query.
+        &quot;&quot;&quot;
+
+        if not isinstance(filter, Filter):
+            return None
+
+        try:
+            expression = buildExpression(filter, self._queryFields)
+            sql = SQLQueryGenerator(expression, self, self.id())
+            return sql.generate()
+        except ValueError:
+            return None
+
+
</ins><span class="cx">     @classmethod
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def listObjects(cls, home):
</span><span class="lines">@@ -965,7 +1124,7 @@
</span><span class="cx">             home._txn, homeID=home._resourceID
</span><span class="cx">         )
</span><span class="cx">         for groupRow in groupRows:
</span><del>-            bindMode, homeID, resourceID, bindName, bindStatus, bindRevision, bindMessage = groupRow[:AddressBookObject.bindColumnCount] #@UnusedVariable
</del><ins>+            bindMode, homeID, resourceID, externalID, bindName, bindStatus, bindRevision, bindMessage = groupRow[:AddressBookObject.bindColumnCount] #@UnusedVariable
</ins><span class="cx">             ownerAddressBookID = yield AddressBookObject.ownerAddressBookIDFromGroupID(home._txn, resourceID)
</span><span class="cx">             ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerAddressBookID, create=True)
</span><span class="cx">             names |= set([ownerHome.uid()])
</span><span class="lines">@@ -993,7 +1152,7 @@
</span><span class="cx">         )
</span><span class="cx">         # get ownerHomeIDs
</span><span class="cx">         for dataRow in dataRows:
</span><del>-            bindMode, homeID, resourceID, bindName, bindStatus, bindRevision, bindMessage = dataRow[:cls.bindColumnCount] #@UnusedVariable
</del><ins>+            bindMode, homeID, resourceID, externalID, bindName, bindStatus, bindRevision, bindMessage = dataRow[:cls.bindColumnCount] #@UnusedVariable
</ins><span class="cx">             ownerHome = yield home.ownerHomeWithChildID(resourceID)
</span><span class="cx">             ownerHomeToDataRowMap[ownerHome] = dataRow
</span><span class="cx"> 
</span><span class="lines">@@ -1002,7 +1161,7 @@
</span><span class="cx">             home._txn, homeID=home._resourceID
</span><span class="cx">         )
</span><span class="cx">         for groupBindRow in groupBindRows:
</span><del>-            bindMode, homeID, resourceID, name, bindStatus, bindRevision, bindMessage = groupBindRow[:AddressBookObject.bindColumnCount] #@UnusedVariable
</del><ins>+            bindMode, homeID, resourceID, externalID, name, bindStatus, bindRevision, bindMessage = groupBindRow[:AddressBookObject.bindColumnCount] #@UnusedVariable
</ins><span class="cx">             ownerAddressBookID = yield AddressBookObject.ownerAddressBookIDFromGroupID(home._txn, resourceID)
</span><span class="cx">             ownerHome = yield home.ownerHomeWithChildID(ownerAddressBookID)
</span><span class="cx">             if ownerHome not in ownerHomeToDataRowMap:
</span><span class="lines">@@ -1023,32 +1182,17 @@
</span><span class="cx"> 
</span><span class="cx">             # Create the actual objects merging in properties
</span><span class="cx">             for ownerHome, dataRow in ownerHomeToDataRowMap.iteritems():
</span><del>-                bindMode, homeID, resourceID, name, bindStatus, bindRevision, bindMessage = dataRow[:cls.bindColumnCount] #@UnusedVariable
-                additionalBind = dataRow[cls.bindColumnCount:cls.bindColumnCount + len(cls.additionalBindColumns())]
-                metadata = dataRow[cls.bindColumnCount + len(cls.additionalBindColumns()):]
</del><ins>+                bindData = dataRow[:cls.bindColumnCount]
+                additionalBindData = dataRow[cls.bindColumnCount:cls.bindColumnCount + len(cls.additionalBindColumns())]
+                metadataData = dataRow[cls.bindColumnCount + len(cls.additionalBindColumns()):]
+                propstore = propertyStores.get(ownerHome._addressbookPropertyStoreID, None)
</ins><span class="cx"> 
</span><del>-                child = cls(
-                    home=home,
-                    name=ownerHome.uid(),
-                    resourceID=ownerHome._resourceID,
-                    mode=bindMode,
-                    status=bindStatus,
-                    revision=bindRevision,
-                    message=bindMessage,
-                    ownerHome=ownerHome,
-                )
</del><ins>+                # Some adjustments for addressbook share model
+                bindData[cls.bindColumns().index(cls._bindSchema.RESOURCE_ID)] = ownerHome._resourceID
+                bindData[cls.bindColumns().index(cls._bindSchema.RESOURCE_NAME)] = ownerHome.uid()
</ins><span class="cx"> 
</span><del>-                for attr, value in zip(cls.additionalBindAttributes(), additionalBind):
-                    setattr(child, attr, value)
-                for attr, value in zip(cls.metadataAttributes(), metadata):
-                    setattr(child, attr, value)
</del><ins>+                child = yield cls.makeClass(home, bindData, additionalBindData, metadataData, propstore, ownerHome)
</ins><span class="cx">                 child._syncTokenRevision = revisions[child._resourceID]
</span><del>-                propstore = propertyStores.get(ownerHome._addressbookPropertyStoreID, None)
-                # We have to re-adjust the property store object to account for possible shared
-                # collections as previously we loaded them all as if they were owned
-                if propstore:
-                    propstore._setDefaultUserUID(ownerHome.uid())
-                yield child._loadPropertyStore(propstore)
</del><span class="cx">                 results.append(child)
</span><span class="cx"> 
</span><span class="cx">         returnValue(results)
</span><span class="lines">@@ -1111,7 +1255,7 @@
</span><span class="cx"> 
</span><span class="cx">     @classmethod
</span><span class="cx">     @inlineCallbacks
</span><del>-    def _indirectObjectWithNameOrID(cls, home, name=None, resourceID=None, accepted=True):
</del><ins>+    def _indirectObjectWithNameOrID(cls, home, name=None, resourceID=None, externalID=None, accepted=True):
</ins><span class="cx">         # replaces objectWithName()
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Synthesize and indirect child for matching name or id based on whether shared groups exist.
</span><span class="lines">@@ -1123,56 +1267,17 @@
</span><span class="cx">         @return: an L{CommonHomeChild} or C{None} if no such child
</span><span class="cx">             exists.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        rows = None
-        ownerHome = None
</del><span class="cx"> 
</span><del>-        # TODO: add queryCacher support
-
-        if rows is None:
-            # No cached copy
-            if name:
-                ownerHome = yield home._txn.addressbookHomeWithUID(name)
-                if ownerHome is None:
-                    returnValue(None)
-                resourceID = ownerHome.addressbook()._resourceID
-            rows = yield AddressBookObject._bindForHomeIDAndAddressBookID.on(
-                home._txn, homeID=home._resourceID, addressbookID=resourceID
-            )
-
-        if not rows:
</del><ins>+        dbData = yield cls._getDBDataIndirect(home, name, resourceID, externalID)
+        if dbData is None:
</ins><span class="cx">             returnValue(None)
</span><ins>+        bindData, additionalBindData, metadataData, ownerHome = dbData
</ins><span class="cx"> 
</span><del>-        groupID = None
-        overallBindStatus = _BIND_STATUS_INVITED
-        minBindRevision = None
-        for row in rows:
-            bindMode, homeID, resourceGroupID, name, bindStatus, bindRevision, bindMessage = row[:cls.bindColumnCount] #@UnusedVariable
-            if groupID is None:
-                groupID = resourceGroupID
-            minBindRevision = min(minBindRevision, bindRevision) if minBindRevision is not None else bindRevision
-            if bindStatus == _BIND_STATUS_ACCEPTED:
-                overallBindStatus = _BIND_STATUS_ACCEPTED
-
-        if accepted is not None and (overallBindStatus == _BIND_STATUS_ACCEPTED) != bool(accepted):
</del><ins>+        bindStatus = bindData[cls.bindColumns().index(cls._bindSchema.BIND_STATUS)]
+        if accepted is not None and (bindStatus == _BIND_STATUS_ACCEPTED) != bool(accepted):
</ins><span class="cx">             returnValue(None)
</span><del>-        additionalBind = row[cls.bindColumnCount:cls.bindColumnCount + len(cls.additionalBindColumns())]
</del><span class="cx"> 
</span><del>-        if ownerHome is None:
-            ownerAddressBookID = yield AddressBookObject.ownerAddressBookIDFromGroupID(home._txn, groupID)
-            ownerHome = yield home.ownerHomeWithChildID(ownerAddressBookID)
-
-        child = cls(
-            home=home,
-            name=ownerHome.uid(),
-            resourceID=resourceID,
-            mode=_BIND_MODE_INDIRECT,
-            status=overallBindStatus,
-            revision=minBindRevision,
-            message=&quot;&quot;,
-            ownerHome=ownerHome,
-            ownerName=ownerHome.uid()
-        )
-        yield child.initFromStore(additionalBind)
</del><ins>+        child = yield cls.makeClass(home, bindData, additionalBindData, metadataData, None, ownerHome)
</ins><span class="cx">         returnValue(child)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1266,7 +1371,7 @@
</span><span class="cx">             groupBindRows = yield AddressBookObject._unacceptedBindForHomeIDAndAddressBookID.on(
</span><span class="cx">                 self._txn, homeID=self._home._resourceID, addressbookID=self._resourceID
</span><span class="cx">             )
</span><del>-            returnValue([groupBindRow[2] for groupBindRow in groupBindRows])
</del><ins>+            returnValue([groupBindRow[self.bindColumns().index(self._bindSchema.RESOURCE_ID)] for groupBindRow in groupBindRows])
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -1280,7 +1385,7 @@
</span><span class="cx">             groupBindRows = yield AddressBookObject._acceptedBindForHomeIDAndAddressBookID.on(
</span><span class="cx">                 self._txn, homeID=self._home._resourceID, addressbookID=self._resourceID
</span><span class="cx">             )
</span><del>-            returnValue([groupBindRow[2] for groupBindRow in groupBindRows])
</del><ins>+            returnValue([groupBindRow[self.bindColumns().index(self._bindSchema.RESOURCE_ID)] for groupBindRow in groupBindRows])
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -1299,7 +1404,7 @@
</span><span class="cx">             readWriteGroupIDs = set()
</span><span class="cx">             readOnlyGroupIDs = set()
</span><span class="cx">             for groupBindRow in groupBindRows:
</span><del>-                bindMode, homeID, resourceID, name, bindStatus, bindRevision, bindMessage = groupBindRow[:AddressBookObject.bindColumnCount] #@UnusedVariable
</del><ins>+                bindMode, homeID, resourceID, externalID, name, bindStatus, bindRevision, bindMessage = groupBindRow[:AddressBookObject.bindColumnCount] #@UnusedVariable
</ins><span class="cx">                 if bindMode == _BIND_MODE_WRITE:
</span><span class="cx">                     readWriteGroupIDs.add(resourceID)
</span><span class="cx">                 else:
</span><span class="lines">@@ -1360,7 +1465,7 @@
</span><span class="cx">         readWriteGroupIDs = []
</span><span class="cx">         readOnlyGroupIDs = []
</span><span class="cx">         for groupBindRow in groupBindRows:
</span><del>-            bindMode, homeID, resourceID, name, bindStatus, bindRevision, bindMessage = groupBindRow[:AddressBookObject.bindColumnCount] #@UnusedVariable
</del><ins>+            bindMode, homeID, resourceID, externalID, name, bindStatus, bindRevision, bindMessage = groupBindRow[:AddressBookObject.bindColumnCount] #@UnusedVariable
</ins><span class="cx">             if bindMode == _BIND_MODE_WRITE:
</span><span class="cx">                 readWriteGroupIDs.append(resourceID)
</span><span class="cx">             else:
</span><span class="lines">@@ -1445,7 +1550,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def shareWith(self, shareeHome, mode, status=None, summary=None):
</del><ins>+    def shareWith(self, shareeHome, mode, status=None, summary=None, shareName=None):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Share this (owned) L{AddressBookObject} with another home.
</span><span class="cx"> 
</span><span class="lines">@@ -1473,11 +1578,12 @@
</span><span class="cx"> 
</span><span class="cx">         @inlineCallbacks
</span><span class="cx">         def doInsert(subt):
</span><del>-            newName = self.newShareName()
</del><ins>+            newName = shareName if shareName is not None else self.newShareName()
</ins><span class="cx">             yield self._bindInsertQuery.on(
</span><span class="cx">                 subt,
</span><span class="cx">                 homeID=shareeHome._resourceID,
</span><span class="cx">                 resourceID=self._resourceID,
</span><ins>+                externalID=None,
</ins><span class="cx">                 name=newName,
</span><span class="cx">                 mode=mode,
</span><span class="cx">                 bindStatus=status,
</span><span class="lines">@@ -1514,14 +1620,14 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def createShare(self, shareeUID, mode, summary=None):
</del><ins>+    def createShare(self, shareeUID, mode, summary=None, shareName=None):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Create a new shared resource. If the mode is direct, the share is created in accepted state,
</span><span class="cx">         otherwise the share is created in invited state.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         if self._kind == _ABO_KIND_GROUP:
</span><del>-            shareeView = yield super(AddressBookObjectSharingMixIn, self).createShare(shareeUID, mode, summary)
</del><ins>+            shareeView = yield super(AddressBookObjectSharingMixIn, self).createShare(shareeUID, mode, summary, shareName)
</ins><span class="cx">             returnValue(shareeView)
</span><span class="cx">         else:
</span><span class="cx">             returnValue(None)
</span><span class="lines">@@ -1617,8 +1723,9 @@
</span><span class="cx">                         # update revision in all remaining bind table rows for this address book
</span><span class="cx">                         yield shareeView.addressbook().notifyPropertyChanged()
</span><span class="cx">                         for groupBindRow in groupBindRows:
</span><del>-                            if groupBindRow[2] != shareeView._resourceID:
-                                groupObject = yield shareeView.addressbook().objectResourceWithID(groupBindRow[2])
</del><ins>+                            resid = groupBindRow[self.bindColumns().index(self._bindSchema.RESOURCE_ID)]
+                            if resid != shareeView._resourceID:
+                                groupObject = yield shareeView.addressbook().objectResourceWithID(resid)
</ins><span class="cx">                                 yield groupObject._initBindRevision()
</span><span class="cx">                         if shareeView.addressbook().fullyShared():
</span><span class="cx">                             yield shareeView.addressbook()._initBindRevision()
</span><span class="lines">@@ -1670,7 +1777,9 @@
</span><span class="cx">                 yield addressbookAsShared.notifyPropertyChanged()
</span><span class="cx">                 #update revision in all remaining bind table rows for this address book
</span><span class="cx">                 for groupBindRow in groupBindRows:
</span><del>-                    groupObject = yield addressbookAsShared.objectResourceWithID(groupBindRow[2])
</del><ins>+                    groupObject = yield addressbookAsShared.objectResourceWithID(
+                        groupBindRow[self.bindColumns().index(self._bindSchema.RESOURCE_ID)]
+                    )
</ins><span class="cx">                     yield groupObject._initBindRevision()
</span><span class="cx">                 addressbookAsShared._objects = {}
</span><span class="cx">                 addressbookAsShared._objectNames = None
</span><span class="lines">@@ -1750,25 +1859,147 @@
</span><span class="cx">     _objectSchema = schema.ADDRESSBOOK_OBJECT
</span><span class="cx">     _bindSchema = schema.SHARED_GROUP_BIND
</span><span class="cx"> 
</span><ins>+    _componentClass = VCard
+
</ins><span class="cx">     # used by CommonHomeChild._childrenAndMetadataForHomeID() only
</span><span class="cx">     # _homeChildSchema = schema.ADDRESSBOOK_OBJECT
</span><span class="cx">     # _homeChildMetaDataSchema = schema.ADDRESSBOOK_OBJECT
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @classmethod
+    @inlineCallbacks
+    def makeClass(cls, parent, objectData, groupBindData=None, propstore=None):
+        &quot;&quot;&quot;
+        Given the various database rows, build the actual class.
+
+        @param parent: the parent collection object
+        @type parent: L{AddressBook}
+        @param objectData: the standard set of object columns
+        @type objectData: C{list}
+        @param groupBindData: additional group bind data
+        @type groupBindData: C{list}
+        @param propstore: a property store to use, or C{None} to load it automatically
+        @type propstore: L{PropertyStore}
+
+        @return: the constructed child class
+        @rtype: L{CommonHomeChild}
+        &quot;&quot;&quot;
+
+        c = cls._externalClass if parent.external() else cls
+        child = c(
+            parent,
+            objectData[cls._allColumns().index(cls._objectSchema.RESOURCE_NAME)],
+            objectData[cls._allColumns().index(cls._objectSchema.UID)],
+        )
+
+        for attr, value in zip(child._rowAttributes(), objectData):
+            setattr(child, attr, value)
+
+        yield child._loadPropertyStore(propstore)
+
+        if groupBindData:
+            bindMode, homeID, resourceID, externalID, bindName, bindStatus, bindRevision, bindMessage = groupBindData[:AddressBookObject.bindColumnCount] #@UnusedVariable
+            child._bindMode = bindMode
+            child._bindStatus = bindStatus
+            child._bindMessage = bindMessage
+            child._bindName = bindName
+            child._bindRevision = bindRevision
+        else:
+            invites = yield child.sharingInvites()
+            if len(invites):
+                child._bindMessage = &quot;shared&quot;
+
+        returnValue(child)
+
+
+    @classmethod
+    @inlineCallbacks
+    def _getDBData(cls, parent, name, uid, resourceID):
+        &quot;&quot;&quot;
+        Given a set of identifying information, load the data rows for the object. Only one of
+        L{name}, L{uid} or L{resourceID} is specified - others are C{None}.
+
+        @param parent: the parent collection object
+        @type parent: L{AddressBook}
+        @param name: the resource name
+        @type name: C{str}
+        @param uid: the UID of the data
+        @type uid: C{str}
+        @param resourceID: the resource ID
+        @type resourceID: C{int}
+        &quot;&quot;&quot;
+
+        row = None
+        groupBindRow = None
+
+        if parent.owned() or parent.fullyShared():  # owned or fully shared
+            row = yield super(AddressBookObject, cls)._getDBData(parent, name, uid, resourceID)
+
+            # Might be special group
+            if row is None and parent.fullyShared():
+                if name:
+                    if name == parent._groupForSharedAddressBookName():
+                        row = parent._groupForSharedAddressBookRow()
+                elif uid:
+                    if uid == (yield parent._groupForSharedAddressBookUID()):
+                        row = parent._groupForSharedAddressBookRow()
+                elif resourceID:
+                    if resourceID == parent.id():
+                        rows = parent._groupForSharedAddressBookRow()
+
+        else:
+            acceptedGroupIDs = yield parent.acceptedGroupIDs()
+            allowedObjectIDs = yield parent.expandGroupIDs(parent._txn, acceptedGroupIDs)
+            rows = None
+            if name:
+                if allowedObjectIDs:
+                    rows = (yield cls._allColumnsWithResourceIDsAndName(allowedObjectIDs).on(
+                        parent._txn,
+                        name=name,
+                        resourceIDs=allowedObjectIDs,
+                    ))
+            elif uid:
+                if allowedObjectIDs:
+                    rows = (yield cls._allColumnsWithResourceIDsAndUID(allowedObjectIDs).on(
+                        parent._txn,
+                        uid=uid,
+                        resourceIDs=allowedObjectIDs,
+                    ))
+            elif resourceID:
+                # Also allow invited groups
+                if resourceID in allowedObjectIDs or resourceID in (yield parent.unacceptedGroupIDs()):
+                    rows = (yield cls._allColumnsWithResourceID.on(
+                        parent._txn,
+                        resourceID=resourceID,
+                    ))
+            if rows:
+                row = rows[0]
+
+        if row is not None:
+            if row[cls._allColumns().index(cls._objectSchema.KIND)] == _ABO_KIND_GROUP:
+
+                resourceID = row[cls._allColumns().index(cls._objectSchema.RESOURCE_ID)]
+                groupBindRows = yield AddressBookObject._bindForResourceIDAndHomeID.on(
+                    parent._txn, resourceID=resourceID, homeID=parent._home._resourceID
+                )
+
+                if groupBindRows:
+                    groupBindRow = groupBindRows[0]
+
+        returnValue((row, groupBindRow,))
+
+
</ins><span class="cx">     def __init__(self, addressbook, name, uid, resourceID=None, options=None):
</span><span class="cx"> 
</span><span class="cx">         self._kind = None
</span><span class="cx">         self._ownerAddressBookResourceID = None
</span><del>-        # _self._component is the cached, current component
-        # super._objectText now contains the text as read of the database only,
-        #     not including group member text
-        self._component = None
</del><span class="cx">         self._bindMode = None
</span><span class="cx">         self._bindStatus = None
</span><span class="cx">         self._bindMessage = None
</span><span class="cx">         self._bindName = None
</span><span class="cx">         self._bindRevision = None
</span><span class="cx">         super(AddressBookObject, self).__init__(addressbook, name, uid, resourceID, options)
</span><ins>+        self._externalID = None
</ins><span class="cx">         self._options = {} if options is None else options
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1793,6 +2024,15 @@
</span><span class="cx">         return self._resourceID == self.addressbook()._resourceID
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def external(self):
+        &quot;&quot;&quot;
+        Is this an external object.
+
+        @return: a string.
+        &quot;&quot;&quot;
+        return self.addressbook().external()
+
+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def remove(self):
</span><span class="cx"> 
</span><span class="lines">@@ -1882,7 +2122,8 @@
</span><span class="cx">         yield super(AddressBookObject, self).remove()
</span><span class="cx">         self._kind = None
</span><span class="cx">         self._ownerAddressBookResourceID = None
</span><del>-        self._component = None
</del><ins>+        self._objectText = None
+        self._cachedComponent = None
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -1911,7 +2152,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         obj = cls._objectSchema
</span><span class="cx">         return Select(
</span><del>-            cls._allColumns, From=obj,
</del><ins>+            cls._allColumns(), From=obj,
</ins><span class="cx">             Where=(column == Parameter(paramName)).And(
</span><span class="cx">                 obj.RESOURCE_ID.In(Parameter(&quot;resourceIDs&quot;, len(resourceIDs)))),
</span><span class="cx">         )
</span><span class="lines">@@ -1931,7 +2172,7 @@
</span><span class="cx">     def _allColumnsWithResourceID(cls): #@NoSelf
</span><span class="cx">         obj = cls._objectSchema
</span><span class="cx">         return Select(
</span><del>-            cls._allColumns, From=obj,
</del><ins>+            cls._allColumns(), From=obj,
</ins><span class="cx">             Where=obj.RESOURCE_ID == Parameter(&quot;resourceID&quot;),)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1954,7 +2195,7 @@
</span><span class="cx">         )
</span><span class="cx">         if groupBindRows:
</span><span class="cx">             groupBindRow = groupBindRows[0]
</span><del>-            bindMode, homeID, resourceID, bindName, bindStatus, bindRevision, bindMessage = groupBindRow[:AddressBookObject.bindColumnCount] #@UnusedVariable
</del><ins>+            bindMode, homeID, resourceID, externalID, bindName, bindStatus, bindRevision, bindMessage = groupBindRow[:AddressBookObject.bindColumnCount] #@UnusedVariable
</ins><span class="cx"> 
</span><span class="cx">             if accepted is not None and (bindStatus == _BIND_STATUS_ACCEPTED) != bool(accepted):
</span><span class="cx">                 returnValue(None)
</span><span class="lines">@@ -1967,93 +2208,20 @@
</span><span class="cx">         returnValue(None)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @classmethod
</ins><span class="cx">     @inlineCallbacks
</span><del>-    def initFromStore(self):
-        &quot;&quot;&quot;
-        Initialise this object from the store. We read in and cache all the
-        extra metadata from the DB to avoid having to do DB queries for those
-        individually later. Either the name or uid is present, so we have to
-        tweak the query accordingly.
</del><ins>+    def objectWith(cls, parent, name=None, uid=None, resourceID=None):
</ins><span class="cx"> 
</span><del>-        @return: L{self} if object exists in the DB, else C{None}
-        &quot;&quot;&quot;
-        abo = None
-        if self.owned() or self.addressbook().fullyShared():  # owned or fully shared
-            abo = yield super(AddressBookObject, self).initFromStore()
</del><ins>+        row, groupBindRow = yield cls._getDBData(parent, name, uid, resourceID)
</ins><span class="cx"> 
</span><del>-            # Might be special group
-            if abo is None and self.addressbook().fullyShared():
-                rows = None
-                if self._name:
-                    if self._name == self.addressbook()._groupForSharedAddressBookName():
-                        rows = [self.addressbook()._groupForSharedAddressBookRow()]
-                elif self._uid:
-                    if self._uid == (yield self.addressbook()._groupForSharedAddressBookUID()):
-                        rows = [self.addressbook()._groupForSharedAddressBookRow()]
-                elif self._resourceID:
-                    if self.isGroupForSharedAddressBook():
-                        rows = [self.addressbook()._groupForSharedAddressBookRow()]
-
-                if rows:
-                    self._initFromRow(tuple(rows[0]))
-                    yield self._loadPropertyStore()
-                    abo = self
-
</del><ins>+        if row:
+            child = yield cls.makeClass(parent, row, groupBindRow)
+            returnValue(child)
</ins><span class="cx">         else:
</span><del>-            acceptedGroupIDs = yield self.addressbook().acceptedGroupIDs()
-            allowedObjectIDs = yield self.addressbook().expandGroupIDs(self._txn, acceptedGroupIDs)
-            rows = None
-            if self._name:
-                if allowedObjectIDs:
-                    rows = (yield self._allColumnsWithResourceIDsAndName(allowedObjectIDs).on(
-                        self._txn, name=self._name,
-                        resourceIDs=allowedObjectIDs,
-                    ))
-            elif self._uid:
-                if allowedObjectIDs:
-                    rows = (yield self._allColumnsWithResourceIDsAndUID(allowedObjectIDs).on(
-                        self._txn, uid=self._uid,
-                        resourceIDs=allowedObjectIDs,
-                    ))
-            elif self._resourceID:
-                if (self._resourceID in allowedObjectIDs or
-                        self._resourceID in (yield self.addressbook().unacceptedGroupIDs())): # allow invited groups
-                    rows = (yield self._allColumnsWithResourceID.on(
-                        self._txn, resourceID=self._resourceID,
-                    ))
-            if rows:
-                self._initFromRow(tuple(rows[0]))
-                yield self._loadPropertyStore()
-                abo = self
-
-        if abo is not None:
-            if self._kind == _ABO_KIND_GROUP:
-
-                groupBindRows = yield AddressBookObject._bindForResourceIDAndHomeID.on(
-                    self._txn, resourceID=self._resourceID, homeID=self._home._resourceID
-                )
-
-                if groupBindRows:
-                    groupBindRow = groupBindRows[0]
-                    bindMode, homeID, resourceID, bindName, bindStatus, bindRevision, bindMessage = groupBindRow[:AddressBookObject.bindColumnCount] #@UnusedVariable
-                    self._bindMode = bindMode
-                    self._bindStatus = bindStatus
-                    self._bindMessage = bindMessage
-                    self._bindName = bindName
-                    self._bindRevision = bindRevision
-                else:
-                    invites = yield self.sharingInvites()
-                    if len(invites):
-                        self._bindMessage = &quot;shared&quot;
-
-            yield self._loadPropertyStore()
-
-            returnValue(self)
-        else:
</del><span class="cx">             returnValue(None)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    @classproperty
</del><ins>+    @classmethod
</ins><span class="cx">     def _allColumns(cls): #@NoSelf
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Full set of columns in the object table that need to be loaded to
</span><span class="lines">@@ -2069,24 +2237,23 @@
</span><span class="cx">             obj.MD5,
</span><span class="cx">             Len(obj.TEXT),
</span><span class="cx">             obj.CREATED,
</span><del>-            obj.MODIFIED,
</del><ins>+            obj.MODIFIED
</ins><span class="cx">         ]
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def _initFromRow(self, row):
-        &quot;&quot;&quot;
-        Given a select result using the columns from L{_allColumns}, initialize
-        the object resource state.
-        &quot;&quot;&quot;
-        (self._ownerAddressBookResourceID,
-         self._resourceID,
-         self._name,
-         self._uid,
-         self._kind,
-         self._md5,
-         self._size,
-         self._created,
-         self._modified,) = tuple(row)
</del><ins>+    @classmethod
+    def _rowAttributes(cls): #@NoSelf
+        return (
+            &quot;_ownerAddressBookResourceID&quot;,
+            &quot;_resourceID&quot;,
+            &quot;_name&quot;,
+            &quot;_uid&quot;,
+            &quot;_kind&quot;,
+            &quot;_md5&quot;,
+            &quot;_size&quot;,
+            &quot;_created&quot;,
+            &quot;_modified&quot;,
+         )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @classmethod
</span><span class="lines">@@ -2109,7 +2276,7 @@
</span><span class="cx">         else:
</span><span class="cx">             acceptedGroupIDs = yield addressbook.acceptedGroupIDs()
</span><span class="cx">             allowedObjectIDs = yield addressbook.expandGroupIDs(addressbook._txn, acceptedGroupIDs)
</span><del>-            rows = yield cls._columnsWithResourceIDsQuery(cls._allColumns, allowedObjectIDs).on(
</del><ins>+            rows = yield cls._columnsWithResourceIDsQuery(cls._allColumns(), allowedObjectIDs).on(
</ins><span class="cx">                 addressbook._txn, resourceIDs=allowedObjectIDs
</span><span class="cx">             )
</span><span class="cx">         returnValue(rows)
</span><span class="lines">@@ -2118,7 +2285,7 @@
</span><span class="cx">     @classmethod
</span><span class="cx">     def _allColumnsWithResourceIDsAndNamesQuery(cls, resourceIDs, names):
</span><span class="cx">         obj = cls._objectSchema
</span><del>-        return Select(cls._allColumns, From=obj,
</del><ins>+        return Select(cls._allColumns(), From=obj,
</ins><span class="cx">                       Where=(obj.RESOURCE_ID.In(Parameter(&quot;resourceIDs&quot;, len(resourceIDs))).And(
</span><span class="cx">                           obj.RESOURCE_NAME.In(Parameter(&quot;names&quot;, len(names))))),)
</span><span class="cx"> 
</span><span class="lines">@@ -2234,6 +2401,13 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setComponent(self, component, inserting=False):
</span><span class="cx"> 
</span><ins>+        if isinstance(component, str) or isinstance(component, unicode):
+            component = self._componentClass.fromString(component)
+            try:
+                component = self._componentClass.fromString(component)
+            except InvalidVCardDataError as e:
+                raise InvalidComponentForStoreError(str(e))
+
</ins><span class="cx">         self._componentChanged = False
</span><span class="cx"> 
</span><span class="cx">         if &quot;coaddedUIDs&quot; not in self._options:
</span><span class="lines">@@ -2387,7 +2561,7 @@
</span><span class="cx">             self._objectText = componentText
</span><span class="cx"> 
</span><span class="cx">         self._size = len(self._objectText)
</span><del>-        self._component = component
</del><ins>+        self._cachedComponent = component
</ins><span class="cx">         self._md5 = hashlib.md5(componentText).hexdigest()
</span><span class="cx">         self._componentChanged = originalComponentText != componentText
</span><span class="cx"> 
</span><span class="lines">@@ -2502,7 +2676,7 @@
</span><span class="cx">         only allowed in good data.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-        if self._component is None:
</del><ins>+        if self._cachedComponent is None:
</ins><span class="cx"> 
</span><span class="cx">             if self.isGroupForSharedAddressBook():
</span><span class="cx">                 component = yield self.addressbook()._groupForSharedAddressBookComponent()
</span><span class="lines">@@ -2562,9 +2736,9 @@
</span><span class="cx">                     component.addProperty(Property(&quot;X-ADDRESSBOOKSERVER-KIND&quot;, &quot;group&quot;))
</span><span class="cx">                     component.addProperty(Property(&quot;UID&quot;, self._uid))
</span><span class="cx"> 
</span><del>-            self._component = component
</del><ins>+            self._cachedComponent = component
</ins><span class="cx"> 
</span><del>-        returnValue(self._component)
</del><ins>+        returnValue(self._cachedComponent)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def moveValidation(self, destination, name):
</span><span class="lines">@@ -2679,4 +2853,10 @@
</span><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+# Hook-up class relationships at the end after they have all been defined
+from txdav.carddav.datastore.sql_external import AddressBookHomeExternal, AddressBookExternal, AddressBookObjectExternal
+AddressBookHome._externalClass = AddressBookHomeExternal
+AddressBookHome._childClass = AddressBook
+AddressBook._externalClass = AddressBookExternal
</ins><span class="cx"> AddressBook._objectResourceClass = AddressBookObject
</span><ins>+AddressBookObject._externalClass = AddressBookObjectExternal
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoresql_externalpyfromrev12321CalendarServertrunktxdavcarddavdatastoresql_externalpy"></a>
<div class="copfile"><h4>Copied: CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/sql_external.py (from rev 12321, CalendarServer/trunk/txdav/carddav/datastore/sql_external.py) (0 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/sql_external.py                                (rev 0)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/sql_external.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -0,0 +1,83 @@
</span><ins>+# -*- test-case-name: txdav.caldav.datastore.test.test_sql -*-
+##
+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+&quot;&quot;&quot;
+SQL backend for CardDAV storage when resources are external.
+&quot;&quot;&quot;
+
+from twisted.internet.defer import succeed
+
+from twext.python.log import Logger
+
+from txdav.carddav.datastore.sql import AddressBookHome, AddressBook, \
+    AddressBookObject
+from txdav.common.datastore.sql_external import CommonHomeExternal, CommonHomeChildExternal, \
+    CommonObjectResourceExternal
+
+log = Logger()
+
+class AddressBookHomeExternal(CommonHomeExternal, AddressBookHome):
+
+    def __init__(self, transaction, ownerUID, resourceID):
+
+        AddressBookHome.__init__(self, transaction, ownerUID)
+        CommonHomeExternal.__init__(self, transaction, ownerUID, resourceID)
+
+
+    def hasAddressBookResourceUIDSomewhereElse(self, uid, ok_object, mode):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def getAddressBookResourcesForUID(self, uid):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def createdHome(self):
+        &quot;&quot;&quot;
+        No children - make this a no-op.
+        &quot;&quot;&quot;
+        return succeed(None)
+
+
+    def addressbook(self):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+
+class AddressBookExternal(CommonHomeChildExternal, AddressBook):
+    &quot;&quot;&quot;
+    SQL-based implementation of L{IAddressBook}.
+    &quot;&quot;&quot;
+    pass
+
+
+
+class AddressBookObjectExternal(CommonObjectResourceExternal, AddressBookObject):
+    &quot;&quot;&quot;
+    SQL-based implementation of L{IAddressBookObject}.
+    &quot;&quot;&quot;
+    pass
+
+AddressBookExternal._objectResourceClass = AddressBookObjectExternal
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoretest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.carddav.datastore.test -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoretestcommonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/common.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/common.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/common.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.carddav.datastore,txdav.carddav.datastore.test.test_sql.AddressBookSQLStorageTests -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoretesttest_filepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/test_file.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/test_file.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/test_file.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoretesttest_index_filepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/test_index_file.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/test_index_file.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/test_index_file.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -189,12 +189,12 @@
</span><span class="cx">         self.db.deleteResource(&quot;data3.vcf&quot;)
</span><span class="cx"> 
</span><span class="cx">         tests = (
</span><del>-            (0, ([&quot;data1.vcf&quot;, &quot;data2.vcf&quot;, ], [],)),
-            (1, ([&quot;data2.vcf&quot;, ], [&quot;data3.vcf&quot;, ],)),
-            (2, ([], [&quot;data3.vcf&quot;, ],)),
-            (3, ([], [&quot;data3.vcf&quot;, ],)),
-            (4, ([], [],)),
-            (5, ([], [],)),
</del><ins>+            (0, ([&quot;data1.vcf&quot;, &quot;data2.vcf&quot;, ], [], [],)),
+            (1, ([&quot;data2.vcf&quot;, ], [&quot;data3.vcf&quot;, ], [],)),
+            (2, ([], [&quot;data3.vcf&quot;, ], [],)),
+            (3, ([], [&quot;data3.vcf&quot;, ], [],)),
+            (4, ([], [], [],)),
+            (5, ([], [], [],)),
</ins><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx">         for revision, results in tests:
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoretesttest_sqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/test_sql.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/test_sql.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/test_sql.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx"> from txdav.common.icommondatastore import NoSuchObjectResourceError
</span><span class="cx"> from txdav.common.datastore.sql import EADDRESSBOOKTYPE, CommonObjectResource
</span><span class="cx"> from txdav.common.datastore.sql_tables import  _ABO_KIND_PERSON, _ABO_KIND_GROUP, schema
</span><del>-from txdav.common.datastore.test.util import buildStore
</del><ins>+from txdav.common.datastore.test.util import buildStore, cleanStore
</ins><span class="cx"> from txdav.carddav.datastore.sql import AddressBook
</span><span class="cx"> 
</span><span class="cx"> from txdav.xml.rfc2518 import GETContentLanguage, ResourceType
</span><span class="lines">@@ -56,7 +56,22 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(AddressBookSQLStorageTests, self).setUp()
</span><del>-        self._sqlStore = yield buildStore(self, self.notifierFactory)
</del><ins>+        self._sqlStore = yield buildStore(
+            self,
+            self.notifierFactory,
+            homes=(
+                &quot;home1&quot;,
+                &quot;home2&quot;,
+                &quot;home3&quot;,
+                &quot;home_bad&quot;,
+                &quot;home_empty&quot;,
+                &quot;homeNew&quot;,
+                &quot;new-home&quot;,
+                &quot;uid1&quot;,
+                &quot;uid2&quot;,
+                &quot;xyzzy&quot;,
+            )
+        )
</ins><span class="cx">         yield self.populate()
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -289,7 +304,7 @@
</span><span class="cx">         Test that two concurrent attempts to PUT different address book object resources to the
</span><span class="cx">         same address book home does not cause a deadlock.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        addressbookStore = yield buildStore(self, self.notifierFactory)
</del><ins>+        addressbookStore = self._sqlStore
</ins><span class="cx"> 
</span><span class="cx">         # Provision the home and addressbook now
</span><span class="cx">         txn = addressbookStore.newTransaction()
</span><span class="lines">@@ -395,7 +410,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Test that kind property UID is stored correctly in database
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        addressbookStore = yield buildStore(self, self.notifierFactory)
</del><ins>+        addressbookStore = self._sqlStore
</ins><span class="cx"> 
</span><span class="cx">         # Provision the home and addressbook, one user and one group
</span><span class="cx">         txn = addressbookStore.newTransaction()
</span><span class="lines">@@ -441,7 +456,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Test that kind property vCard is stored correctly in database
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        addressbookStore = yield buildStore(self, self.notifierFactory)
</del><ins>+        addressbookStore = self._sqlStore
</ins><span class="cx"> 
</span><span class="cx">         # Provision the home and addressbook, one user and one group
</span><span class="cx">         txn = addressbookStore.newTransaction()
</span><span class="lines">@@ -532,7 +547,8 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Test that kind property vCard is stored correctly in database
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        addressbookStore = yield buildStore(self, self.notifierFactory)
</del><ins>+        addressbookStore = self._sqlStore
+        cleanStore(self, addressbookStore)
</ins><span class="cx"> 
</span><span class="cx">         # Provision the home and addressbook, one user and one group
</span><span class="cx">         txn = addressbookStore.newTransaction()
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoretesttest_sql_sharingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/test_sql_sharing.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/test_sql_sharing.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/test/test_sql_sharing.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -1134,23 +1134,27 @@
</span><span class="cx">         otherAB = yield self.addressbookUnderTest(home=&quot;user02&quot;, name=&quot;user01&quot;)
</span><span class="cx">         self.assertNotEqual(otherAB._bindRevision, 0)
</span><span class="cx"> 
</span><del>-        changed, deleted = yield otherAB.resourceNamesSinceRevision(0)
</del><ins>+        changed, deleted, invalid = yield otherAB.resourceNamesSinceRevision(0)
</ins><span class="cx">         self.assertNotEqual(len(changed), 0)
</span><span class="cx">         self.assertEqual(len(deleted), 0)
</span><ins>+        self.assertEqual(len(invalid), 0)
</ins><span class="cx"> 
</span><del>-        changed, deleted = yield otherAB.resourceNamesSinceRevision(otherAB._bindRevision)
</del><ins>+        changed, deleted, invalid = yield otherAB.resourceNamesSinceRevision(otherAB._bindRevision)
</ins><span class="cx">         self.assertEqual(len(changed), 0)
</span><span class="cx">         self.assertEqual(len(deleted), 0)
</span><ins>+        self.assertEqual(len(invalid), 0)
</ins><span class="cx"> 
</span><span class="cx">         otherHome = yield self.addressbookHomeUnderTest(name=&quot;user02&quot;)
</span><span class="cx">         for depth in (&quot;1&quot;, &quot;infinity&quot;,):
</span><del>-            changed, deleted = yield otherHome.resourceNamesSinceRevision(0, depth)
</del><ins>+            changed, deleted, invalid = yield otherHome.resourceNamesSinceRevision(0, depth)
</ins><span class="cx">             self.assertNotEqual(len(changed), 0)
</span><span class="cx">             self.assertEqual(len(deleted), 0)
</span><ins>+            self.assertEqual(len(invalid), 0)
</ins><span class="cx"> 
</span><del>-            changed, deleted = yield otherHome.resourceNamesSinceRevision(otherAB._bindRevision, depth)
</del><ins>+            changed, deleted, invalid = yield otherHome.resourceNamesSinceRevision(otherAB._bindRevision, depth)
</ins><span class="cx">             self.assertEqual(len(changed), 0)
</span><span class="cx">             self.assertEqual(len(deleted), 0)
</span><ins>+            self.assertEqual(len(invalid), 0)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -1166,13 +1170,15 @@
</span><span class="cx">         otherAB = yield self.addressbookUnderTest(home=&quot;user02&quot;, name=&quot;user01&quot;)
</span><span class="cx">         self.assertNotEqual(otherAB._bindRevision, 0)
</span><span class="cx"> 
</span><del>-        changed, deleted = yield otherAB.resourceNamesSinceRevision(0)
</del><ins>+        changed, deleted, invalid = yield otherAB.resourceNamesSinceRevision(0)
</ins><span class="cx">         self.assertEqual(set(changed), set(['card1.vcf', 'card2.vcf', 'group1.vcf']))
</span><span class="cx">         self.assertEqual(len(deleted), 0)
</span><ins>+        self.assertEqual(len(invalid), 0)
</ins><span class="cx"> 
</span><del>-        changed, deleted = yield otherAB.resourceNamesSinceRevision(otherAB._bindRevision)
</del><ins>+        changed, deleted, invalid = yield otherAB.resourceNamesSinceRevision(otherAB._bindRevision)
</ins><span class="cx">         self.assertEqual(len(changed), 0)
</span><span class="cx">         self.assertEqual(len(deleted), 0)
</span><ins>+        self.assertEqual(len(invalid), 0)
</ins><span class="cx"> 
</span><span class="cx">         for depth, result in (
</span><span class="cx">             (&quot;1&quot;, ['addressbook/',
</span><span class="lines">@@ -1184,13 +1190,15 @@
</span><span class="cx">                              'user01/card2.vcf',
</span><span class="cx">                              'user01/group1.vcf']
</span><span class="cx">              )):
</span><del>-            changed, deleted = yield otherAB.viewerHome().resourceNamesSinceRevision(0, depth)
</del><ins>+            changed, deleted, invalid = yield otherAB.viewerHome().resourceNamesSinceRevision(0, depth)
</ins><span class="cx">             self.assertEqual(set(changed), set(result))
</span><span class="cx">             self.assertEqual(len(deleted), 0)
</span><ins>+            self.assertEqual(len(invalid), 0)
</ins><span class="cx"> 
</span><del>-            changed, deleted = yield otherAB.viewerHome().resourceNamesSinceRevision(otherAB._bindRevision, depth)
</del><ins>+            changed, deleted, invalid = yield otherAB.viewerHome().resourceNamesSinceRevision(otherAB._bindRevision, depth)
</ins><span class="cx">             self.assertEqual(len(changed), 0)
</span><span class="cx">             self.assertEqual(len(deleted), 0)
</span><ins>+            self.assertEqual(len(invalid), 0)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcarddavdatastoreutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/datastore/util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcarddaviaddressbookstorepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/iaddressbookstore.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/iaddressbookstore.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/iaddressbookstore.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.carddav.datastore,txdav.carddav.datastore.test.test_sql.AddressBookSQLStorageTests -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcarddavresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/resource.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/resource.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/carddav/resource.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommon__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastore__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastorecommonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/common.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/common.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/common.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastorefilepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/file.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/file.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/file.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.caldav.datastore.test.test_file -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -852,7 +852,8 @@
</span><span class="cx">     def resourceNamesSinceToken(self, token, depth):
</span><span class="cx">         deleted = []
</span><span class="cx">         changed = []
</span><del>-        return succeed((changed, deleted))
</del><ins>+        invalid = []
+        return succeed((changed, deleted, invalid))
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     # @cached
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -14,9 +14,6 @@
</span><span class="cx"> # See the License for the specific language governing permissions and
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><del>-from collections import namedtuple
-from txdav.xml import element
-from txdav.base.propertystore.base import PropertyName
</del><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> SQL data store.
</span><span class="lines">@@ -57,32 +54,40 @@
</span><span class="cx"> 
</span><span class="cx"> from txdav.base.datastore.util import QueryCacher
</span><span class="cx"> from txdav.base.datastore.util import normalizeUUIDOrNot
</span><ins>+from txdav.base.propertystore.base import PropertyName
</ins><span class="cx"> from txdav.base.propertystore.none import PropertyStore as NonePropertyStore
</span><span class="cx"> from txdav.base.propertystore.sql import PropertyStore
</span><span class="cx"> from txdav.caldav.icalendarstore import ICalendarTransaction, ICalendarStore
</span><span class="cx"> from txdav.carddav.iaddressbookstore import IAddressBookTransaction
</span><span class="cx"> from txdav.common.datastore.common import HomeChildBase
</span><ins>+from txdav.common.datastore.podding.conduit import PoddingConduit
</ins><span class="cx"> from txdav.common.datastore.sql_tables import _BIND_MODE_OWN, \
</span><span class="cx">     _BIND_STATUS_ACCEPTED, _BIND_STATUS_DECLINED, _BIND_STATUS_INVALID, \
</span><span class="cx">     _BIND_STATUS_INVITED, _BIND_MODE_DIRECT, _BIND_STATUS_DELETED, \
</span><del>-    _BIND_MODE_INDIRECT
</del><ins>+    _BIND_MODE_INDIRECT, _HOME_STATUS_NORMAL, _HOME_STATUS_EXTERNAL
</ins><span class="cx"> from txdav.common.datastore.sql_tables import schema, splitSQLString
</span><del>-from txdav.common.icommondatastore import ConcurrentModification
</del><ins>+from txdav.common.icommondatastore import ConcurrentModification, \
+    RecordNotAllowedError, ExternalShareFailed, ShareNotAllowed, \
+    IndexedSearchException
</ins><span class="cx"> from txdav.common.icommondatastore import HomeChildNameNotAllowedError, \
</span><span class="cx">     HomeChildNameAlreadyExistsError, NoSuchHomeChildError, \
</span><span class="cx">     ObjectResourceNameNotAllowedError, ObjectResourceNameAlreadyExistsError, \
</span><span class="cx">     NoSuchObjectResourceError, AllRetriesFailed, InvalidSubscriptionValues, \
</span><span class="cx">     InvalidIMIPTokenValues, TooManyObjectResourcesError, \
</span><span class="cx">     SyncTokenValidException
</span><del>-from txdav.common.idirectoryservice import IStoreDirectoryService
</del><ins>+from txdav.common.idirectoryservice import IStoreDirectoryService, \
+    DirectoryRecordNotFoundError
</ins><span class="cx"> from txdav.common.inotifications import INotificationCollection, \
</span><span class="cx">     INotificationObject
</span><span class="cx"> from txdav.idav import ChangeCategory
</span><ins>+from txdav.xml import element
</ins><span class="cx"> 
</span><span class="cx"> from uuid import uuid4, UUID
</span><span class="cx"> 
</span><span class="cx"> from zope.interface import implements, directlyProvides
</span><span class="cx"> 
</span><ins>+from collections import namedtuple
+import itertools
</ins><span class="cx"> import json
</span><span class="cx"> import sys
</span><span class="cx"> import time
</span><span class="lines">@@ -189,6 +194,8 @@
</span><span class="cx">         else:
</span><span class="cx">             self.queryCacher = None
</span><span class="cx"> 
</span><ins>+        self.conduit = PoddingConduit(self)
+
</ins><span class="cx">         # Always import these here to trigger proper &quot;registration&quot; of the calendar and address book
</span><span class="cx">         # home classes
</span><span class="cx">         __import__(&quot;txdav.caldav.datastore.sql&quot;)
</span><span class="lines">@@ -210,16 +217,18 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def _withEachHomeDo(self, homeTable, homeFromTxn, action, batchSize): #@UnusedVariable
</del><ins>+    def _withEachHomeDo(self, homeTable, homeFromTxn, action, batchSize, processExternal=False):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Implementation of L{ICalendarStore.withEachCalendarHomeDo} and
</span><span class="cx">         L{IAddressbookStore.withEachAddressbookHomeDo}.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         txn = yield self.newTransaction()
</span><span class="cx">         try:
</span><del>-            allUIDs = yield (Select([homeTable.OWNER_UID], From=homeTable)
-                             .on(txn))
</del><ins>+            allUIDs = yield (Select([homeTable.OWNER_UID], From=homeTable).on(txn))
</ins><span class="cx">             for [uid] in allUIDs:
</span><ins>+                home = yield homeFromTxn(txn, uid)
+                if not processExternal and home.external():
+                    continue
</ins><span class="cx">                 yield action(txn, (yield homeFromTxn(txn, uid)))
</span><span class="cx">         except:
</span><span class="cx">             a, b, c = sys.exc_info()
</span><span class="lines">@@ -229,25 +238,25 @@
</span><span class="cx">             yield txn.commit()
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def withEachCalendarHomeDo(self, action, batchSize=None):
</del><ins>+    def withEachCalendarHomeDo(self, action, batchSize=None, processExternal=False):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Implementation of L{ICalendarStore.withEachCalendarHomeDo}.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         return self._withEachHomeDo(
</span><span class="cx">             schema.CALENDAR_HOME,
</span><span class="cx">             lambda txn, uid: txn.calendarHomeWithUID(uid),
</span><del>-            action, batchSize
</del><ins>+            action, batchSize, processExternal
</ins><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def withEachAddressbookHomeDo(self, action, batchSize=None):
</del><ins>+    def withEachAddressbookHomeDo(self, action, batchSize=None, processExternal=False):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Implementation of L{IAddressbookStore.withEachAddressbookHomeDo}.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         return self._withEachHomeDo(
</span><span class="cx">             schema.ADDRESSBOOK_HOME,
</span><span class="cx">             lambda txn, uid: txn.addressbookHomeWithUID(uid),
</span><del>-            action, batchSize
</del><ins>+            action, batchSize, processExternal
</ins><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -445,7 +454,7 @@
</span><span class="cx">                 if self.delayedLog:
</span><span class="cx">                     self.delayedLog.cancel()
</span><span class="cx">                     self.delayedLog = None
</span><del>-                self.txn.abort()
</del><ins>+                self.txn.timeout()
</ins><span class="cx"> 
</span><span class="cx">         if self.timeoutSeconds:
</span><span class="cx">             self.delayedTimeout = self.callLater(self.timeoutSeconds, _forceAbort)
</span><span class="lines">@@ -473,7 +482,7 @@
</span><span class="cx">         self._label = label
</span><span class="cx">         self._migrating = migrating
</span><span class="cx">         self._primaryHomeType = None
</span><del>-        self._disableCache = disableCache
</del><ins>+        self._disableCache = disableCache or not store.queryCachingEnabled()
</ins><span class="cx">         if disableCache:
</span><span class="cx">             self._queryCacher = None
</span><span class="cx">         else:
</span><span class="lines">@@ -503,6 +512,7 @@
</span><span class="cx">         self.statementCount = 0
</span><span class="cx">         self.iudCount = 0
</span><span class="cx">         self.currentStatement = None
</span><ins>+        self.timedout = False
</ins><span class="cx"> 
</span><span class="cx">         self.logItems = {}
</span><span class="cx"> 
</span><span class="lines">@@ -1074,6 +1084,14 @@
</span><span class="cx">         return self._sqlTxn.abort()
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def timeout(self):
+        &quot;&quot;&quot;
+        Abort the transaction due to time out.
+        &quot;&quot;&quot;
+        self.timedout = True
+        return self.abort()
+
+
</ins><span class="cx">     def statsReport(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Print the stats report and record log items
</span><span class="lines">@@ -1467,10 +1485,108 @@
</span><span class="cx">         if shareeView is not None:
</span><span class="cx">             yield shareeView.declineShare()
</span><span class="cx"> 
</span><del>-        returnValue(shareeView)
</del><ins>+        returnValue(shareeView is not None)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    #
+    # External (cross-pod) sharing - entry point is the sharee's home collection.
+    #
+    @inlineCallbacks
+    def processExternalInvite(self, ownerUID, ownerRID, ownerName, shareUID, bindMode, summary, copy_invite_properties, supported_components=None):
+        &quot;&quot;&quot;
+        External invite received.
+        &quot;&quot;&quot;
</ins><span class="cx"> 
</span><ins>+        # Get the owner home - create external one if not present
+        ownerHome = yield self._txn.homeWithUID(self._homeType, ownerUID, create=True)
+        if ownerHome is None or not ownerHome.external():
+            raise ExternalShareFailed(&quot;Invalid owner UID: {}&quot;.format(ownerUID))
+
+        # Try to find owner calendar via its external id
+        ownerView = yield ownerHome.childWithExternalID(ownerRID)
+        if ownerView is None:
+            try:
+                ownerView = yield ownerHome.createChildWithName(ownerName, externalID=ownerRID)
+            except HomeChildNameAlreadyExistsError:
+                # This is odd - it means we possibly have a left over sharer collection which the sharer likely removed
+                # and re-created with the same name but now it has a different externalID and is not found by the initial
+                # query. What we do is check to see whether any shares still reference the old ID - if they do we are hosed.
+                # If not, we can remove the old item and create a new one.
+                oldOwnerView = yield ownerHome.childWithName(ownerName)
+                invites = yield oldOwnerView.sharingInvites()
+                if len(invites) != 0:
+                    log.error(&quot;External invite collection name is present with a different externalID and still has shares&quot;)
+                    raise
+                log.error(&quot;External invite collection name is present with a different externalID - trying to fix&quot;)
+                yield ownerHome.removeExternalChild(oldOwnerView)
+                ownerView = yield ownerHome.createChildWithName(ownerName, externalID=ownerRID)
+
+            if supported_components is not None and hasattr(ownerView, &quot;setSupportedComponents&quot;):
+                yield ownerView.setSupportedComponents(supported_components)
+
+        # Now carry out the share operation
+        if bindMode == _BIND_MODE_DIRECT:
+            shareeView = yield ownerView.directShareWithUser(self.uid(), shareName=shareUID)
+        else:
+            shareeView = yield ownerView.inviteUserToShare(self.uid(), bindMode, summary, shareName=shareUID)
+
+        shareeView.setInviteCopyProperties(copy_invite_properties)
+
+
+    @inlineCallbacks
+    def processExternalUninvite(self, ownerUID, ownerRID, shareUID):
+        &quot;&quot;&quot;
+        External invite received.
+        &quot;&quot;&quot;
+
+        # Get the owner home
+        ownerHome = yield self._txn.homeWithUID(self._homeType, ownerUID)
+        if ownerHome is None or not ownerHome.external():
+            raise ExternalShareFailed(&quot;Invalid owner UID: {}&quot;.format(ownerUID))
+
+        # Try to find owner calendar via its external id
+        ownerView = yield ownerHome.childWithExternalID(ownerRID)
+        if ownerView is None:
+            raise ExternalShareFailed(&quot;Invalid share ID: {}&quot;.format(shareUID))
+
+        # Now carry out the share operation
+        yield ownerView.uninviteUserFromShare(self.uid())
+
+        # See if there are any references to the external share - if not remove it
+        invites = yield ownerView.sharingInvites()
+        if len(invites) == 0:
+            yield ownerHome.removeExternalChild(ownerView)
+
+
+    @inlineCallbacks
+    def processExternalReply(self, ownerUID, shareeUID, shareUID, bindStatus, summary=None):
+        &quot;&quot;&quot;
+        External invite received.
+        &quot;&quot;&quot;
+
+        # Make sure the shareeUID and shareUID match
+
+        # Get the owner home - create external one if not present
+        shareeHome = yield self._txn.homeWithUID(self._homeType, shareeUID)
+        if shareeHome is None or not shareeHome.external():
+            raise ExternalShareFailed(&quot;Invalid sharee UID: {}&quot;.format(shareeUID))
+
+        # Try to find owner calendar via its external id
+        shareeView = yield shareeHome.anyObjectWithShareUID(shareUID)
+        if shareeView is None:
+            raise ExternalShareFailed(&quot;Invalid share UID: {}&quot;.format(shareUID))
+
+        # Now carry out the share operation
+        if bindStatus == _BIND_STATUS_ACCEPTED:
+            yield shareeHome.acceptShare(shareUID, summary)
+        elif bindStatus == _BIND_STATUS_DECLINED:
+            if shareeView.direct():
+                yield shareeView.deleteShare()
+            else:
+                yield shareeHome.declineShare(shareUID)
+
+
+
</ins><span class="cx"> class CommonHome(SharingHomeMixIn):
</span><span class="cx">     log = Logger()
</span><span class="cx"> 
</span><span class="lines">@@ -1478,6 +1594,7 @@
</span><span class="cx">     _homeType = None
</span><span class="cx">     _homeTable = None
</span><span class="cx">     _homeMetaDataTable = None
</span><ins>+    _externalClass = None
</ins><span class="cx">     _childClass = None
</span><span class="cx">     _childTable = None
</span><span class="cx">     _notifierPrefix = None
</span><span class="lines">@@ -1487,10 +1604,30 @@
</span><span class="cx"> 
</span><span class="cx">     _cacher = None  # Initialize in derived classes
</span><span class="cx"> 
</span><ins>+    @classmethod
+    @inlineCallbacks
+    def makeClass(cls, transaction, ownerUID, no_cache=False):
+        &quot;&quot;&quot;
+        Build the actual home class taking into account the possibility that we might need to
+        switch in the external version of the class.
+
+        @param transaction: transaction
+        @type transaction: L{CommonStoreTransaction}
+        @param ownerUID: owner UID of home to load
+        @type ownerUID: C{str}
+        @param no_cache: should cached query be used
+        @type no_cache: C{bool}
+        &quot;&quot;&quot;
+        home = cls(transaction, ownerUID)
+        actualHome = yield home.initFromStore(no_cache)
+        returnValue(actualHome)
+
+
</ins><span class="cx">     def __init__(self, transaction, ownerUID):
</span><span class="cx">         self._txn = transaction
</span><span class="cx">         self._ownerUID = ownerUID
</span><span class="cx">         self._resourceID = None
</span><ins>+        self._status = _HOME_STATUS_NORMAL
</ins><span class="cx">         self._dataVersion = None
</span><span class="cx">         self._childrenLoaded = False
</span><span class="cx">         self._children = {}
</span><span class="lines">@@ -1554,6 +1691,7 @@
</span><span class="cx">         return (
</span><span class="cx">             cls._homeSchema.RESOURCE_ID,
</span><span class="cx">             cls._homeSchema.OWNER_UID,
</span><ins>+            cls._homeSchema.STATUS,
</ins><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1568,6 +1706,7 @@
</span><span class="cx">         return (
</span><span class="cx">             &quot;_resourceID&quot;,
</span><span class="cx">             &quot;_ownerUID&quot;,
</span><ins>+            &quot;_status&quot;,
</ins><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1612,39 +1751,57 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         result = yield self._cacher.get(self._ownerUID)
</span><span class="cx">         if result is None:
</span><del>-            result = yield self._homeColumnsFromOwnerQuery.on(
-                self._txn, ownerUID=self._ownerUID)
-            if result and not no_cache:
-                yield self._cacher.set(self._ownerUID, result)
</del><ins>+            result = yield self._homeColumnsFromOwnerQuery.on(self._txn, ownerUID=self._ownerUID)
+            if result:
+                result = result[0]
+                if not no_cache:
+                    yield self._cacher.set(self._ownerUID, result)
</ins><span class="cx"> 
</span><span class="cx">         if result:
</span><del>-            for attr, value in zip(self.homeAttributes(), result[0]):
</del><ins>+            for attr, value in zip(self.homeAttributes(), result):
</ins><span class="cx">                 setattr(self, attr, value)
</span><span class="cx"> 
</span><del>-            queryCacher = self._txn._queryCacher
-            if queryCacher:
-                # Get cached copy
-                cacheKey = queryCacher.keyForHomeMetaData(self._resourceID)
-                data = yield queryCacher.get(cacheKey)
</del><ins>+            # STOP! If the status is external we need to convert this object to a CommonHomeExternal class which will
+            # have the right behavior for non-hosted external users.
+            if self._status == _HOME_STATUS_EXTERNAL:
+                actualHome = self._externalClass(self._txn, self._ownerUID, self._resourceID)
</ins><span class="cx">             else:
</span><del>-                data = None
-            if data is None:
-                # Don't have a cached copy
-                data = (yield self._metaDataQuery.on(
-                    self._txn, resourceID=self._resourceID))[0]
-                if queryCacher:
-                    # Cache the data
-                    yield queryCacher.setAfterCommit(self._txn, cacheKey, data)
</del><ins>+                actualHome = self
+            yield actualHome.initMetaDataFromStore()
+            yield actualHome._loadPropertyStore()
</ins><span class="cx"> 
</span><del>-            for attr, value in zip(self.metadataAttributes(), data):
-                setattr(self, attr, value)
</del><ins>+            for factory_type, factory in self._txn._notifierFactories.items():
+                actualHome.addNotifier(factory_type, factory.newNotifier(actualHome))
</ins><span class="cx"> 
</span><del>-            yield self._loadPropertyStore()
-            returnValue(self)
</del><ins>+            returnValue(actualHome)
</ins><span class="cx">         else:
</span><span class="cx">             returnValue(None)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
+    def initMetaDataFromStore(self):
+        &quot;&quot;&quot;
+        Load up the metadata and property store
+        &quot;&quot;&quot;
+
+        queryCacher = self._txn._queryCacher
+        if queryCacher:
+            # Get cached copy
+            cacheKey = queryCacher.keyForHomeMetaData(self._resourceID)
+            data = yield queryCacher.get(cacheKey)
+        else:
+            data = None
+        if data is None:
+            # Don't have a cached copy
+            data = (yield self._metaDataQuery.on(self._txn, resourceID=self._resourceID))[0]
+            if queryCacher:
+                # Cache the data
+                yield queryCacher.setAfterCommit(self._txn, cacheKey, data)
+
+        for attr, value in zip(self.metadataAttributes(), data):
+            setattr(self, attr, value)
+
+
</ins><span class="cx">     @classmethod
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def listHomes(cls, txn):
</span><span class="lines">@@ -1664,16 +1821,20 @@
</span><span class="cx">     @classmethod
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def homeWithUID(cls, txn, uid, create=False):
</span><del>-        homeObject = cls(txn, uid)
-        for factory_type, factory in txn._notifierFactories.items():
-            homeObject.addNotifier(factory_type, factory.newNotifier(homeObject))
-        homeObject = (yield homeObject.initFromStore())
</del><ins>+        homeObject = yield cls.makeClass(txn, uid)
</ins><span class="cx">         if homeObject is not None:
</span><span class="cx">             returnValue(homeObject)
</span><span class="cx">         else:
</span><span class="cx">             if not create:
</span><span class="cx">                 returnValue(None)
</span><span class="cx"> 
</span><ins>+            # Determine if the user is local or external
+            record = txn.directoryService().recordWithUID(uid)
+            if record is None:
+                raise DirectoryRecordNotFoundError(&quot;Cannot create home for UID since no directory record exists: {}&quot;.format(uid))
+
+            state = _HOME_STATUS_NORMAL if record.thisServer() else _HOME_STATUS_EXTERNAL
+
</ins><span class="cx">             # Use savepoint so we can do a partial rollback if there is a race condition
</span><span class="cx">             # where this row has already been inserted
</span><span class="cx">             savepoint = SavepointAction(&quot;homeWithUID&quot;)
</span><span class="lines">@@ -1685,19 +1846,17 @@
</span><span class="cx">                 resourceid = (yield Insert(
</span><span class="cx">                     {
</span><span class="cx">                         cls._homeSchema.OWNER_UID: uid,
</span><ins>+                        cls._homeSchema.STATUS: state,
</ins><span class="cx">                         cls._homeSchema.DATAVERSION: cls._dataVersionValue,
</span><span class="cx">                     },
</span><del>-                    Return=cls._homeSchema.RESOURCE_ID).on(txn))[0][0]
-                yield Insert(
-                    {cls._homeMetaDataSchema.RESOURCE_ID: resourceid}).on(txn)
</del><ins>+                    Return=cls._homeSchema.RESOURCE_ID
+                ).on(txn))[0][0]
+                yield Insert({cls._homeMetaDataSchema.RESOURCE_ID: resourceid}).on(txn)
</ins><span class="cx">             except Exception:  # FIXME: Really want to trap the pg.DatabaseError but in a non-DB specific manner
</span><span class="cx">                 yield savepoint.rollback(txn)
</span><span class="cx"> 
</span><span class="cx">                 # Retry the query - row may exist now, if not re-raise
</span><del>-                homeObject = cls(txn, uid)
-                for factory_type, factory in txn._notifierFactories.items():
-                    homeObject.addNotifier(factory_type, factory.newNotifier(homeObject))
-                homeObject = (yield homeObject.initFromStore())
</del><ins>+                homeObject = yield cls.makeClass(txn, uid)
</ins><span class="cx">                 if homeObject:
</span><span class="cx">                     returnValue(homeObject)
</span><span class="cx">                 else:
</span><span class="lines">@@ -1708,10 +1867,7 @@
</span><span class="cx">                 # Note that we must not cache the owner_uid-&gt;resource_id
</span><span class="cx">                 # mapping in _cacher when creating as we don't want that to appear
</span><span class="cx">                 # until AFTER the commit
</span><del>-                home = cls(txn, uid)
-                for factory_type, factory in txn._notifierFactories.items():
-                    home.addNotifier(factory_type, factory.newNotifier(home))
-                home = (yield home.initFromStore(no_cache=True))
</del><ins>+                home = yield cls.makeClass(txn, uid, no_cache=True)
</ins><span class="cx">                 yield home.createdHome()
</span><span class="cx">                 returnValue(home)
</span><span class="cx"> 
</span><span class="lines">@@ -1727,7 +1883,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def __repr__(self):
</span><del>-        return &quot;&lt;%s: %s&gt;&quot; % (self.__class__.__name__, self._resourceID)
</del><ins>+        return &quot;&lt;%s: %s, %s&gt;&quot; % (self.__class__.__name__, self._resourceID, self._ownerUID)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def id(self):
</span><span class="lines">@@ -1749,6 +1905,15 @@
</span><span class="cx">         return self._ownerUID
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def external(self):
+        &quot;&quot;&quot;
+        Is this an external home.
+
+        @return: a string.
+        &quot;&quot;&quot;
+        return False
+
+
</ins><span class="cx">     def transaction(self):
</span><span class="cx">         return self._txn
</span><span class="cx"> 
</span><span class="lines">@@ -1866,6 +2031,17 @@
</span><span class="cx">         return self._childClass.objectWithID(self, resourceID)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def childWithExternalID(self, externalID):
+        &quot;&quot;&quot;
+        Retrieve the child with the given C{externalID} contained in this
+        home.
+
+        @param name: a string.
+        @return: an L{ICalendar} or C{None} if no such child exists.
+        &quot;&quot;&quot;
+        return self._childClass.objectWithExternalID(self, externalID)
+
+
</ins><span class="cx">     def allChildWithID(self, resourceID):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Retrieve the child with the given C{resourceID} contained in this
</span><span class="lines">@@ -1878,12 +2054,11 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def createChildWithName(self, name):
</del><ins>+    def createChildWithName(self, name, externalID=None):
</ins><span class="cx">         if name.startswith(&quot;.&quot;):
</span><span class="cx">             raise HomeChildNameNotAllowedError(name)
</span><span class="cx"> 
</span><del>-        yield self._childClass.create(self, name)
-        child = (yield self.childWithName(name))
</del><ins>+        child = yield self._childClass.create(self, name, externalID=externalID)
</ins><span class="cx">         returnValue(child)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -2025,6 +2200,10 @@
</span><span class="cx">         record a revision for the sharee home and sharee collection name with the &quot;deleted&quot; flag set. That way
</span><span class="cx">         the shared collection can be reported as removed.
</span><span class="cx"> 
</span><ins>+        For external shared collections we need to report them as invalid as we cannot aggregate the sync token
+        for this home with the sync token from the external share which is under the control of the other pod.
+        Reporting it as invalid means that clients should do requests directly on the share itself to sync it.
+
</ins><span class="cx">         @param revision: the sync revision to compare to
</span><span class="cx">         @type revision: C{str}
</span><span class="cx">         @param depth: depth for determine what changed
</span><span class="lines">@@ -2033,6 +2212,7 @@
</span><span class="cx"> 
</span><span class="cx">         changed = set()
</span><span class="cx">         deleted = set()
</span><ins>+        invalid = set()
</ins><span class="cx">         if revision:
</span><span class="cx">             cs = schema.CALENDARSERVER
</span><span class="cx">             minValidRevision = int((yield Select(
</span><span class="lines">@@ -2090,13 +2270,17 @@
</span><span class="cx">                         for name in (yield share.listObjectResources()):
</span><span class="cx">                             changed.add(&quot;%s/%s&quot; % (path, name,))
</span><span class="cx">             else:
</span><del>-                sharedChanged, sharedDeleted = yield share.sharedChildResourceNamesSinceRevision(revision, depth)
</del><ins>+                sharedChanged, sharedDeleted, sharedInvalid = yield share.sharedChildResourceNamesSinceRevision(revision, depth)
</ins><span class="cx">                 changed |= sharedChanged
</span><ins>+                changed -= sharedInvalid
</ins><span class="cx">                 deleted |= sharedDeleted
</span><ins>+                deleted -= sharedInvalid
+                invalid |= sharedInvalid
</ins><span class="cx"> 
</span><span class="cx">         changed = sorted(changed)
</span><span class="cx">         deleted = sorted(deleted)
</span><del>-        returnValue((changed, deleted))
</del><ins>+        invalid = sorted(invalid)
+        returnValue((changed, deleted, invalid,))
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -2419,7 +2603,7 @@
</span><span class="cx">     def revisionFromToken(self, token):
</span><span class="cx">         if token is None:
</span><span class="cx">             return 0
</span><del>-        elif isinstance(token, str):
</del><ins>+        elif isinstance(token, str) or isinstance(token, unicode):
</ins><span class="cx">             _ignore_uuid, revision = token.split(&quot;_&quot;, 1)
</span><span class="cx">             return int(revision)
</span><span class="cx">         else:
</span><span class="lines">@@ -2476,6 +2660,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         changed = []
</span><span class="cx">         deleted = []
</span><ins>+        invalid = []
</ins><span class="cx">         if revision:
</span><span class="cx">             cs = schema.CALENDARSERVER
</span><span class="cx">             minValidRevision = int((yield Select(
</span><span class="lines">@@ -2504,7 +2689,7 @@
</span><span class="cx">         else:
</span><span class="cx">             changed = yield self.listObjectResources()
</span><span class="cx"> 
</span><del>-        returnValue((changed, deleted))
</del><ins>+        returnValue((changed, deleted, invalid))
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @classproperty
</span><span class="lines">@@ -2789,6 +2974,7 @@
</span><span class="cx">         return Insert({
</span><span class="cx">             bind.HOME_RESOURCE_ID: Parameter(&quot;homeID&quot;),
</span><span class="cx">             bind.RESOURCE_ID: Parameter(&quot;resourceID&quot;),
</span><ins>+            bind.EXTERNAL_ID: Parameter(&quot;externalID&quot;),
</ins><span class="cx">             bind.RESOURCE_NAME: Parameter(&quot;name&quot;),
</span><span class="cx">             bind.BIND_MODE: Parameter(&quot;mode&quot;),
</span><span class="cx">             bind.BIND_STATUS: Parameter(&quot;bindStatus&quot;),
</span><span class="lines">@@ -2870,11 +3056,21 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         bind = cls._bindSchema
</span><span class="cx">         return cls._bindFor((bind.RESOURCE_ID == Parameter(&quot;resourceID&quot;))
</span><del>-                               .And(bind.HOME_RESOURCE_ID == Parameter(&quot;homeID&quot;))
-                               )
</del><ins>+                            .And(bind.HOME_RESOURCE_ID == Parameter(&quot;homeID&quot;)))
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @classproperty
</span><ins>+    def _bindForExternalIDAndHomeID(cls): #@NoSelf
+        &quot;&quot;&quot;
+        DAL query that looks up home bind rows by home child
+        resource ID and home resource ID.
+        &quot;&quot;&quot;
+        bind = cls._bindSchema
+        return cls._bindFor((bind.EXTERNAL_ID == Parameter(&quot;externalID&quot;))
+                            .And(bind.HOME_RESOURCE_ID == Parameter(&quot;homeID&quot;)))
+
+
+    @classproperty
</ins><span class="cx">     def _bindForNameAndHomeID(cls): #@NoSelf
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DAL query that looks up any bind rows by home child
</span><span class="lines">@@ -2882,15 +3078,14 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         bind = cls._bindSchema
</span><span class="cx">         return cls._bindFor((bind.RESOURCE_NAME == Parameter(&quot;name&quot;))
</span><del>-                               .And(bind.HOME_RESOURCE_ID == Parameter(&quot;homeID&quot;))
-                               )
</del><ins>+                            .And(bind.HOME_RESOURCE_ID == Parameter(&quot;homeID&quot;)))
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     #
</span><span class="cx">     # Higher level API
</span><span class="cx">     #
</span><span class="cx">     @inlineCallbacks
</span><del>-    def inviteUserToShare(self, shareeUID, mode, summary):
</del><ins>+    def inviteUserToShare(self, shareeUID, mode, summary, shareName=None):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Invite a user to share this collection - either create the share if it does not exist, or
</span><span class="cx">         update the existing share with new values. Make sure a notification is sent as well.
</span><span class="lines">@@ -2909,15 +3104,19 @@
</span><span class="cx">             status = _BIND_STATUS_INVITED if shareeView.shareStatus() in (_BIND_STATUS_DECLINED, _BIND_STATUS_INVALID) else None
</span><span class="cx">             yield self.updateShare(shareeView, mode=mode, status=status, summary=summary)
</span><span class="cx">         else:
</span><del>-            shareeView = yield self.createShare(shareeUID=shareeUID, mode=mode, summary=summary)
</del><ins>+            shareeView = yield self.createShare(shareeUID=shareeUID, mode=mode, summary=summary, shareName=shareName)
</ins><span class="cx"> 
</span><del>-        # Send invite notification
-        yield self._sendInviteNotification(shareeView)
</del><ins>+        # Check for external
+        if shareeView.viewerHome().external():
+            yield self._sendExternalInvite(shareeView)
+        else:
+            # Send invite notification
+            yield self._sendInviteNotification(shareeView)
</ins><span class="cx">         returnValue(shareeView)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def directShareWithUser(self, shareeUID):
</del><ins>+    def directShareWithUser(self, shareeUID, shareName=None):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Create a direct share with the specified user. Note it is currently up to the app layer
</span><span class="cx">         to enforce access control - this is not ideal as we really should have control of that in
</span><span class="lines">@@ -2932,8 +3131,13 @@
</span><span class="cx">         # Ignore if it already exists
</span><span class="cx">         shareeView = yield self.shareeView(shareeUID)
</span><span class="cx">         if shareeView is None:
</span><del>-            shareeView = yield self.createShare(shareeUID=shareeUID, mode=_BIND_MODE_DIRECT)
</del><ins>+            shareeView = yield self.createShare(shareeUID=shareeUID, mode=_BIND_MODE_DIRECT, shareName=shareName)
</ins><span class="cx">             yield shareeView.newShare()
</span><ins>+
+            # Check for external
+            if shareeView.viewerHome().external():
+                yield self._sendExternalInvite(shareeView)
+
</ins><span class="cx">         returnValue(shareeView)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -2949,13 +3153,16 @@
</span><span class="cx"> 
</span><span class="cx">         shareeView = yield self.shareeView(shareeUID)
</span><span class="cx">         if shareeView is not None:
</span><del>-            # If current user state is accepted then we send an invite with the new state, otherwise
-            # we cancel any existing invites for the user
-            if not shareeView.direct():
-                if shareeView.shareStatus() != _BIND_STATUS_ACCEPTED:
-                    yield self._removeInviteNotification(shareeView)
-                else:
-                    yield self._sendInviteNotification(shareeView, notificationState=_BIND_STATUS_DELETED)
</del><ins>+            if shareeView.viewerHome().external():
+                yield self._sendExternalUninvite(shareeView)
+            else:
+                # If current user state is accepted then we send an invite with the new state, otherwise
+                # we cancel any existing invites for the user
+                if not shareeView.direct():
+                    if shareeView.shareStatus() != _BIND_STATUS_ACCEPTED:
+                        yield self._removeInviteNotification(shareeView)
+                    else:
+                        yield self._sendInviteNotification(shareeView, notificationState=_BIND_STATUS_DELETED)
</ins><span class="cx"> 
</span><span class="cx">             # Remove the bind
</span><span class="cx">             yield self.removeShare(shareeView)
</span><span class="lines">@@ -2968,10 +3175,13 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         if not self.direct() and self.shareStatus() != _BIND_STATUS_ACCEPTED:
</span><ins>+            if self.external():
+                yield self._replyExternalInvite(_BIND_STATUS_ACCEPTED, summary)
</ins><span class="cx">             ownerView = yield self.ownerView()
</span><span class="cx">             yield ownerView.updateShare(self, status=_BIND_STATUS_ACCEPTED)
</span><span class="cx">             yield self.newShare(displayname=summary)
</span><del>-            yield self._sendReplyNotification(ownerView, summary)
</del><ins>+            if not ownerView.external():
+                yield self._sendReplyNotification(ownerView, summary)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -2981,24 +3191,43 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         if not self.direct() and self.shareStatus() != _BIND_STATUS_DECLINED:
</span><ins>+            if self.external():
+                yield self._replyExternalInvite(_BIND_STATUS_DECLINED)
</ins><span class="cx">             ownerView = yield self.ownerView()
</span><span class="cx">             yield ownerView.updateShare(self, status=_BIND_STATUS_DECLINED)
</span><del>-            yield self._sendReplyNotification(ownerView)
</del><ins>+            if not ownerView.external():
+                yield self._sendReplyNotification(ownerView)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def deleteShare(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        This share is being deleted - either decline or remove (for direct shares).
</del><ins>+        This share is being deleted (by the sharee) - either decline or remove (for direct shares).
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         ownerView = yield self.ownerView()
</span><span class="cx">         if self.direct():
</span><span class="cx">             yield ownerView.removeShare(self)
</span><ins>+            if ownerView.external():
+                yield self._replyExternalInvite(_BIND_STATUS_DECLINED)
</ins><span class="cx">         else:
</span><span class="cx">             yield self.declineShare()
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
+    def ownerDeleteShare(self):
+        &quot;&quot;&quot;
+        This share is being deleted (by the owner) - either decline or remove (for direct shares).
+        &quot;&quot;&quot;
+
+        # Change status on store object
+        yield self.setShared(False)
+
+        # Remove all sharees (direct and invited)
+        for invitation in (yield self.sharingInvites()):
+            yield self.uninviteUserFromShare(invitation.shareeUID)
+
+
</ins><span class="cx">     def newShare(self, displayname=None):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Override in derived classes to do any specific operations needed when a share
</span><span class="lines">@@ -3098,10 +3327,57 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     #
</span><del>-    # Lower level API
</del><ins>+    # External/cross-pod API
</ins><span class="cx">     #
</span><ins>+    @inlineCallbacks
+    def _sendExternalInvite(self, shareeView):
</ins><span class="cx"> 
</span><ins>+        yield self._txn.store().conduit.send_shareinvite(
+            self._txn,
+            shareeView.ownerHome()._homeType,
+            shareeView.ownerHome().uid(),
+            self.id(),
+            self.shareName(),
+            shareeView.viewerHome().uid(),
+            shareeView.shareUID(),
+            shareeView.shareMode(),
+            shareeView.shareMessage(),
+            self.getInviteCopyProperties(),
+            supported_components=self.getSupportedComponents() if hasattr(self, &quot;getSupportedComponents&quot;) else None,
+        )
+
+
</ins><span class="cx">     @inlineCallbacks
</span><ins>+    def _sendExternalUninvite(self, shareeView):
+
+        yield self._txn.store().conduit.send_shareuninvite(
+            self._txn,
+            shareeView.ownerHome()._homeType,
+            shareeView.ownerHome().uid(),
+            self.id(),
+            shareeView.viewerHome().uid(),
+            shareeView.shareUID(),
+        )
+
+
+    @inlineCallbacks
+    def _replyExternalInvite(self, status, summary=None):
+
+        yield self._txn.store().conduit.send_sharereply(
+            self._txn,
+            self.viewerHome()._homeType,
+            self.ownerHome().uid(),
+            self.viewerHome().uid(),
+            self.shareUID(),
+            status,
+            summary,
+        )
+
+
+    #
+    # Lower level API
+    #
+    @inlineCallbacks
</ins><span class="cx">     def ownerView(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Return the owner resource counterpart of this shared resource.
</span><span class="lines">@@ -3124,7 +3400,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def shareWith(self, shareeHome, mode, status=None, summary=None):
</del><ins>+    def shareWith(self, shareeHome, mode, status=None, summary=None, shareName=None):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Share this (owned) L{CommonHomeChild} with another home.
</span><span class="cx"> 
</span><span class="lines">@@ -3152,11 +3428,12 @@
</span><span class="cx"> 
</span><span class="cx">         @inlineCallbacks
</span><span class="cx">         def doInsert(subt):
</span><del>-            newName = self.newShareName()
</del><ins>+            newName = shareName if shareName is not None else self.newShareName()
</ins><span class="cx">             yield self._bindInsertQuery.on(
</span><span class="cx">                 subt,
</span><span class="cx">                 homeID=shareeHome._resourceID,
</span><span class="cx">                 resourceID=self._resourceID,
</span><ins>+                externalID=self._externalID,
</ins><span class="cx">                 name=newName,
</span><span class="cx">                 mode=mode,
</span><span class="cx">                 bindStatus=status,
</span><span class="lines">@@ -3190,7 +3467,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def createShare(self, shareeUID, mode, summary=None):
</del><ins>+    def createShare(self, shareeUID, mode, summary=None, shareName=None):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Create a new shared resource. If the mode is direct, the share is created in accepted state,
</span><span class="cx">         otherwise the share is created in invited state.
</span><span class="lines">@@ -3202,6 +3479,7 @@
</span><span class="cx">             mode=mode,
</span><span class="cx">             status=_BIND_STATUS_INVITED if mode != _BIND_MODE_DIRECT else _BIND_STATUS_ACCEPTED,
</span><span class="cx">             summary=summary,
</span><ins>+            shareName=shareName,
</ins><span class="cx">         )
</span><span class="cx">         shareeView = yield self.shareeView(shareeUID)
</span><span class="cx">         returnValue(shareeView)
</span><span class="lines">@@ -3262,12 +3540,7 @@
</span><span class="cx">             if summary is not None:
</span><span class="cx">                 shareeView._bindMessage = columnMap[bind.MESSAGE]
</span><span class="cx"> 
</span><del>-            queryCacher = self._txn._queryCacher
-            if queryCacher:
-                cacheKey = queryCacher.keyForObjectWithName(shareeView._home._resourceID, shareeView._name)
-                yield queryCacher.invalidateAfterCommit(self._txn, cacheKey)
-                cacheKey = queryCacher.keyForObjectWithResourceID(shareeView._home._resourceID, shareeView._resourceID)
-                yield queryCacher.invalidateAfterCommit(self._txn, cacheKey)
</del><ins>+            yield shareeView.invalidateQueryCache()
</ins><span class="cx"> 
</span><span class="cx">             # Must send notification to ensure cache invalidation occurs
</span><span class="cx">             yield self.notifyPropertyChanged()
</span><span class="lines">@@ -3321,12 +3594,7 @@
</span><span class="cx">             homeID=shareeHome._resourceID,
</span><span class="cx">         )
</span><span class="cx"> 
</span><del>-        queryCacher = self._txn._queryCacher
-        if queryCacher:
-            cacheKey = queryCacher.keyForObjectWithName(shareeHome._resourceID, shareeView._name)
-            yield queryCacher.invalidateAfterCommit(self._txn, cacheKey)
-            cacheKey = queryCacher.keyForObjectWithResourceID(shareeHome._resourceID, shareeView._resourceID)
-            yield queryCacher.invalidateAfterCommit(self._txn, cacheKey)
</del><ins>+        yield shareeView.invalidateQueryCache()
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -3526,6 +3794,24 @@
</span><span class="cx">         return self._bindMessage
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def getInviteCopyProperties(self):
+        &quot;&quot;&quot;
+        Get a dictionary of property name/values (as strings) for properties that are shadowable and
+        need to be copied to a sharee's collection when an external (cross-pod) share is created.
+        Sub-classes should override to expose the properties they care about.
+        &quot;&quot;&quot;
+        return {}
+
+
+    def setInviteCopyProperties(self, props):
+        &quot;&quot;&quot;
+        Copy a set of shadowable properties (as name/value strings) onto this shared resource when
+        a cross-pod invite is processed. Sub-classes should override to expose the properties they
+        care about.
+        &quot;&quot;&quot;
+        pass
+
+
</ins><span class="cx">     @classmethod
</span><span class="cx">     def metadataColumns(cls):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -3570,13 +3856,14 @@
</span><span class="cx">             cls._bindSchema.BIND_MODE,
</span><span class="cx">             cls._bindSchema.HOME_RESOURCE_ID,
</span><span class="cx">             cls._bindSchema.RESOURCE_ID,
</span><ins>+            cls._bindSchema.EXTERNAL_ID,
</ins><span class="cx">             cls._bindSchema.RESOURCE_NAME,
</span><span class="cx">             cls._bindSchema.BIND_STATUS,
</span><span class="cx">             cls._bindSchema.BIND_REVISION,
</span><span class="cx">             cls._bindSchema.MESSAGE
</span><span class="cx">         )
</span><span class="cx"> 
</span><del>-    bindColumnCount = 7
</del><ins>+    bindColumnCount = 8
</ins><span class="cx"> 
</span><span class="cx">     @classmethod
</span><span class="cx">     def additionalBindColumns(cls):
</span><span class="lines">@@ -3636,6 +3923,7 @@
</span><span class="cx">             yield queryCacher.invalidateAfterCommit(self._txn, queryCacher.keyForHomeChildMetaData(self._resourceID))
</span><span class="cx">             yield queryCacher.invalidateAfterCommit(self._txn, queryCacher.keyForObjectWithName(self._home._resourceID, self._name))
</span><span class="cx">             yield queryCacher.invalidateAfterCommit(self._txn, queryCacher.keyForObjectWithResourceID(self._home._resourceID, self._resourceID))
</span><ins>+            yield queryCacher.invalidateAfterCommit(self._txn, queryCacher.keyForObjectWithExternalID(self._home._resourceID, self._externalID))
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -3651,6 +3939,7 @@
</span><span class="cx">         &quot;_resourceID&quot;,
</span><span class="cx">     )
</span><span class="cx"> 
</span><ins>+    _externalClass = None
</ins><span class="cx">     _objectResourceClass = None
</span><span class="cx"> 
</span><span class="cx">     _bindSchema = None
</span><span class="lines">@@ -3661,11 +3950,148 @@
</span><span class="cx">     _objectSchema = None
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def __init__(self, home, name, resourceID, mode, status, revision=0, message=None, ownerHome=None, ownerName=None):
</del><ins>+    @classmethod
+    @inlineCallbacks
+    def makeClass(cls, home, bindData, additionalBindData, metadataData, propstore=None, ownerHome=None):
+        &quot;&quot;&quot;
+        Given the various database rows, build the actual class.
</ins><span class="cx"> 
</span><ins>+        @param home: the parent home object
+        @type home: L{CommonHome}
+        @param bindData: the standard set of bind columns
+        @type bindData: C{list}
+        @param additionalBindData: additional bind data specific to sub-classes
+        @type additionalBindData: C{list}
+        @param metadataData: metadata data
+        @type metadataData: C{list}
+        @param propstore: a property store to use, or C{None} to load it automatically
+        @type propstore: L{PropertyStore}
+        @param ownerHome: the home of the owner, or C{None} to figure it out automatically
+        @type ownerHome: L{CommonHome}
+
+        @return: the constructed child class
+        @rtype: L{CommonHomeChild}
+        &quot;&quot;&quot;
+
+        bindMode, _ignore_homeID, resourceID, externalID, name, bindStatus, bindRevision, bindMessage = bindData
+
+        if ownerHome is None:
+            if bindMode == _BIND_MODE_OWN:
+                ownerHome = home
+                ownerName = name
+            else:
+                ownerHome, ownerName = yield home.ownerHomeAndChildNameForChildID(resourceID)
+        else:
+            ownerName = None
+
+        c = cls._externalClass if ownerHome.external() else cls
+        child = c(
+            home=home,
+            name=name,
+            resourceID=resourceID,
+            mode=bindMode,
+            status=bindStatus,
+            revision=bindRevision,
+            message=bindMessage,
+            ownerHome=ownerHome,
+            ownerName=ownerName,
+            externalID=externalID,
+        )
+
+        if additionalBindData:
+            for attr, value in zip(child.additionalBindAttributes(), additionalBindData):
+                setattr(child, attr, value)
+
+        if metadataData:
+            for attr, value in zip(child.metadataAttributes(), metadataData):
+                setattr(child, attr, value)
+
+        # We have to re-adjust the property store object to account for possible shared
+        # collections as previously we loaded them all as if they were owned
+        if propstore and bindMode != _BIND_MODE_OWN:
+            propstore._setDefaultUserUID(ownerHome.uid())
+        yield child._loadPropertyStore(propstore)
+
+        returnValue(child)
+
+
+    @classmethod
+    @inlineCallbacks
+    def _getDBData(cls, home, name, resourceID, externalID):
+        &quot;&quot;&quot;
+        Given a set of identifying information, load the data rows for the object. Only one of
+        L{name}, L{resourceID} or L{externalID} is specified - others are C{None}.
+
+        @param home: the parent home object
+        @type home: L{CommonHome}
+        @param name: the resource name
+        @type name: C{str}
+        @param resourceID: the resource ID
+        @type resourceID: C{int}
+        @param externalID: the resource ID of the external (cross-pod) referenced item
+        @type externalID: C{int}
+        &quot;&quot;&quot;
+
+        # Get the bind row data
+        row = None
+        queryCacher = home._txn._queryCacher
+
+        if queryCacher:
+            # Retrieve data from cache
+            if name:
+                cacheKey = queryCacher.keyForObjectWithName(home._resourceID, name)
+            elif resourceID:
+                cacheKey = queryCacher.keyForObjectWithResourceID(home._resourceID, resourceID)
+            elif externalID:
+                cacheKey = queryCacher.keyForObjectWithExternalID(home._resourceID, externalID)
+            row = yield queryCacher.get(cacheKey)
+
+        if row is None:
+            # No cached copy
+            if name:
+                rows = yield cls._bindForNameAndHomeID.on(home._txn, name=name, homeID=home._resourceID)
+            elif resourceID:
+                rows = yield cls._bindForResourceIDAndHomeID.on(home._txn, resourceID=resourceID, homeID=home._resourceID)
+            elif externalID:
+                rows = yield cls._bindForExternalIDAndHomeID.on(home._txn, externalID=externalID, homeID=home._resourceID)
+            row = rows[0] if rows else None
+
+        if not row:
+            returnValue(None)
+
+        if queryCacher:
+            # Cache the result
+            queryCacher.setAfterCommit(home._txn, queryCacher.keyForObjectWithName(home._resourceID, name), row)
+            queryCacher.setAfterCommit(home._txn, queryCacher.keyForObjectWithResourceID(home._resourceID, resourceID), row)
+            queryCacher.setAfterCommit(home._txn, queryCacher.keyForObjectWithExternalID(home._resourceID, externalID), row)
+
+        bindData = row[:cls.bindColumnCount]
+        additionalBindData = row[cls.bindColumnCount:cls.bindColumnCount + len(cls.additionalBindColumns())]
+        resourceID = bindData[cls.bindColumns().index(cls._bindSchema.RESOURCE_ID)]
+
+        # Get the matching metadata data
+        metadataData = None
+        if queryCacher:
+            # Retrieve from cache
+            cacheKey = queryCacher.keyForHomeChildMetaData(resourceID)
+            metadataData = yield queryCacher.get(cacheKey)
+
+        if metadataData is None:
+            # No cached copy
+            metadataData = (yield cls._metadataByIDQuery.on(home._txn, resourceID=resourceID))[0]
+            if queryCacher:
+                # Cache the results
+                yield queryCacher.setAfterCommit(home._txn, cacheKey, metadataData)
+
+        returnValue((bindData, additionalBindData, metadataData,))
+
+
+    def __init__(self, home, name, resourceID, mode, status, revision=0, message=None, ownerHome=None, ownerName=None, externalID=None):
+
</ins><span class="cx">         self._home = home
</span><span class="cx">         self._name = name
</span><span class="cx">         self._resourceID = resourceID
</span><ins>+        self._externalID = externalID
</ins><span class="cx">         self._bindMode = mode
</span><span class="cx">         self._bindStatus = status
</span><span class="cx">         self._bindRevision = revision
</span><span class="lines">@@ -3687,9 +4113,7 @@
</span><span class="cx">         else:
</span><span class="cx">             self._notifiers = None
</span><span class="cx"> 
</span><del>-        self._index = None  # Derived classes need to set this
</del><span class="cx"> 
</span><del>-
</del><span class="cx">     def memoMe(self, key, memo): #@UnusedVariable
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Add this object to the memo dictionary in whatever fashion is appropriate.
</span><span class="lines">@@ -3715,7 +4139,7 @@
</span><span class="cx">         rows = yield cls._acceptedBindForHomeID.on(
</span><span class="cx">             home._txn, homeID=home._resourceID
</span><span class="cx">         )
</span><del>-        names = [row[3] for row in rows]
</del><ins>+        names = [row[cls.bindColumns().index(cls._bindSchema.RESOURCE_NAME)] for row in rows]
</ins><span class="cx">         returnValue(names)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -3748,119 +4172,66 @@
</span><span class="cx"> 
</span><span class="cx">         # Create the actual objects merging in properties
</span><span class="cx">         for dataRow in dataRows:
</span><del>-            bindMode, homeID, resourceID, bindName, bindStatus, bindRevision, bindMessage = dataRow[:cls.bindColumnCount] #@UnusedVariable
-            additionalBind = dataRow[cls.bindColumnCount:cls.bindColumnCount + len(cls.additionalBindColumns())]
-            metadata = dataRow[cls.bindColumnCount + len(cls.additionalBindColumns()):]
</del><ins>+            bindData = dataRow[:cls.bindColumnCount] #@UnusedVariable
+            resourceID = bindData[cls.bindColumns().index(cls._bindSchema.RESOURCE_ID)]
+            additionalBindData = dataRow[cls.bindColumnCount:cls.bindColumnCount + len(cls.additionalBindColumns())]
+            metadataData = dataRow[cls.bindColumnCount + len(cls.additionalBindColumns()):]
+            propstore = propertyStores.get(resourceID, None)
</ins><span class="cx"> 
</span><del>-            if bindMode == _BIND_MODE_OWN:
-                ownerHome = home
-                ownerName = bindName
-            else:
-                #TODO: get all ownerHomeIDs at once
-                ownerHome, ownerName = yield home.ownerHomeAndChildNameForChildID(resourceID)
-
-            child = cls(
-                home=home,
-                name=bindName,
-                resourceID=resourceID,
-                mode=bindMode,
-                status=bindStatus,
-                revision=bindRevision,
-                message=bindMessage,
-                ownerHome=ownerHome,
-                ownerName=ownerName,
-            )
-            for attr, value in zip(cls.additionalBindAttributes(), additionalBind):
-                setattr(child, attr, value)
-            for attr, value in zip(cls.metadataAttributes(), metadata):
-                setattr(child, attr, value)
</del><ins>+            child = yield cls.makeClass(home, bindData, additionalBindData, metadataData, propstore)
</ins><span class="cx">             child._syncTokenRevision = revisions[resourceID]
</span><del>-            propstore = propertyStores.get(resourceID, None)
-            # We have to re-adjust the property store object to account for possible shared
-            # collections as previously we loaded them all as if they were owned
-            if propstore and bindMode != _BIND_MODE_OWN:
-                propstore._setDefaultUserUID(ownerHome.uid())
-            yield child._loadPropertyStore(propstore)
</del><span class="cx">             results.append(child)
</span><ins>+
</ins><span class="cx">         returnValue(results)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @classmethod
</span><span class="cx">     def objectWithName(cls, home, name, accepted=True):
</span><del>-        return cls._objectWithNameOrID(home, name=name, accepted=accepted)
</del><ins>+        return cls.objectWith(home, name=name, accepted=accepted)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @classmethod
</span><span class="cx">     def objectWithID(cls, home, resourceID, accepted=True):
</span><del>-        return cls._objectWithNameOrID(home, resourceID=resourceID, accepted=accepted)
</del><ins>+        return cls.objectWith(home, resourceID=resourceID, accepted=accepted)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @classmethod
</span><ins>+    def objectWithExternalID(cls, home, externalID, accepted=True):
+        return cls.objectWith(home, externalID=externalID, accepted=accepted)
+
+
+    @classmethod
</ins><span class="cx">     @inlineCallbacks
</span><del>-    def _objectWithNameOrID(cls, home, name=None, resourceID=None, accepted=True):
-        # replaces objectWithName()
</del><ins>+    def objectWith(cls, home, name=None, resourceID=None, externalID=None, accepted=True):
</ins><span class="cx">         &quot;&quot;&quot;
</span><del>-        Retrieve the child with the given C{name} or C{resourceID} contained in the given
-        C{home}.
</del><ins>+        Create the object using one of the specified arguments as the key to load it. One
+        and only one of the keyword arguments must be set.
</ins><span class="cx"> 
</span><del>-        @param home: a L{CommonHome}.
</del><ins>+        @param parent: parent collection
+        @type parent: L{CommonHomeChild}
+        @param name: name of the resource, or C{None}
+        @type name: C{str}
+        @param uid: resource data UID, or C{None}
+        @type uid: C{str}
+        @param resourceID: resource id
+        @type resourceID: C{int}
+        @param accepted: if C{True} only load owned or accepted share items
+        @type accepted: C{bool}
</ins><span class="cx"> 
</span><del>-        @param name: a string; the name of the L{CommonHomeChild} to retrieve.
-
-        @return: an L{CommonHomeChild} or C{None} if no such child
-            exists.
</del><ins>+        @return: the new object or C{None} if not found
+        @rtype: C{CommonHomeChild}
</ins><span class="cx">         &quot;&quot;&quot;
</span><del>-        rows = None
-        queryCacher = home._txn._queryCacher
</del><span class="cx"> 
</span><del>-        if queryCacher:
-            # Retrieve data from cache
-            if name:
-                cacheKey = queryCacher.keyForObjectWithName(home._resourceID, name)
-            else:
-                cacheKey = queryCacher.keyForObjectWithResourceID(home._resourceID, resourceID)
-            rows = yield queryCacher.get(cacheKey)
-
-        if rows is None:
-            # No cached copy
-            if name:
-                rows = yield cls._bindForNameAndHomeID.on(home._txn, name=name, homeID=home._resourceID)
-            else:
-                rows = yield cls._bindForResourceIDAndHomeID.on(home._txn, resourceID=resourceID, homeID=home._resourceID)
-
-        if not rows:
</del><ins>+        dbData = yield cls._getDBData(home, name, resourceID, externalID)
+        if dbData is None:
</ins><span class="cx">             returnValue(None)
</span><ins>+        bindData, additionalBindData, metadataData = dbData
</ins><span class="cx"> 
</span><del>-        row = rows[0]
-        bindMode, homeID, resourceID, name, bindStatus, bindRevision, bindMessage = row[:cls.bindColumnCount] #@UnusedVariable
-
-        if queryCacher:
-            # Cache the result
-            queryCacher.setAfterCommit(home._txn, queryCacher.keyForObjectWithName(home._resourceID, name), rows)
-            queryCacher.setAfterCommit(home._txn, queryCacher.keyForObjectWithResourceID(home._resourceID, resourceID), rows)
-
</del><ins>+        bindStatus = bindData[cls.bindColumns().index(cls._bindSchema.BIND_STATUS)]
</ins><span class="cx">         if accepted is not None and (bindStatus == _BIND_STATUS_ACCEPTED) != bool(accepted):
</span><span class="cx">             returnValue(None)
</span><del>-        additionalBind = row[cls.bindColumnCount:cls.bindColumnCount + len(cls.additionalBindColumns())]
</del><span class="cx"> 
</span><del>-        if bindMode == _BIND_MODE_OWN:
-            ownerHome = home
-            ownerName = name
-        else:
-            ownerHome, ownerName = yield home.ownerHomeAndChildNameForChildID(resourceID)
-
-        child = cls(
-            home=home,
-            name=name,
-            resourceID=resourceID,
-            mode=bindMode,
-            status=bindStatus,
-            revision=bindRevision,
-            message=bindMessage,
-            ownerHome=ownerHome,
-            ownerName=ownerName
-        )
-        yield child.initFromStore(additionalBind)
</del><ins>+        child = yield cls.makeClass(home, bindData, additionalBindData, metadataData)
</ins><span class="cx">         returnValue(child)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -3888,35 +4259,28 @@
</span><span class="cx"> 
</span><span class="cx">     @classmethod
</span><span class="cx">     @inlineCallbacks
</span><del>-    def create(cls, home, name):
</del><ins>+    def create(cls, home, name, externalID=None):
</ins><span class="cx"> 
</span><del>-        if (yield cls._bindForNameAndHomeID.on(home._txn,
-            name=name, homeID=home._resourceID)):
</del><ins>+        if (yield cls._bindForNameAndHomeID.on(home._txn, name=name, homeID=home._resourceID)):
</ins><span class="cx">             raise HomeChildNameAlreadyExistsError(name)
</span><span class="cx"> 
</span><span class="cx">         if name.startswith(&quot;.&quot;):
</span><span class="cx">             raise HomeChildNameNotAllowedError(name)
</span><span class="cx"> 
</span><span class="cx">         # Create this object
</span><del>-        resourceID = (
-            yield cls._insertHomeChild.on(home._txn))[0][0]
</del><ins>+        resourceID = (yield cls._insertHomeChild.on(home._txn))[0][0]
</ins><span class="cx"> 
</span><span class="cx">         # Initialize this object
</span><del>-        _created, _modified = (
-            yield cls._insertHomeChildMetaData.on(home._txn,
-                                                  resourceID=resourceID))[0]
</del><ins>+        _created, _modified = (yield cls._insertHomeChildMetaData.on(home._txn, resourceID=resourceID))[0]
</ins><span class="cx">         # Bind table needs entry
</span><span class="cx">         yield cls._bindInsertQuery.on(
</span><del>-            home._txn, homeID=home._resourceID, resourceID=resourceID,
</del><ins>+            home._txn, homeID=home._resourceID, resourceID=resourceID, externalID=externalID,
</ins><span class="cx">             name=name, mode=_BIND_MODE_OWN, bindStatus=_BIND_STATUS_ACCEPTED,
</span><span class="cx">             message=None,
</span><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx">         # Initialize other state
</span><del>-        child = cls(home, name, resourceID, _BIND_MODE_OWN, _BIND_STATUS_ACCEPTED)
-        child._created = _created
-        child._modified = _modified
-        yield child._loadPropertyStore()
</del><ins>+        child = yield cls.objectWithID(home, resourceID)
</ins><span class="cx"> 
</span><span class="cx">         yield child._initSyncToken()
</span><span class="cx"> 
</span><span class="lines">@@ -3937,44 +4301,32 @@
</span><span class="cx">                       Where=child.RESOURCE_ID == Parameter(&quot;resourceID&quot;))
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    @inlineCallbacks
-    def initFromStore(self, additionalBind=None):
</del><ins>+    def id(self):
</ins><span class="cx">         &quot;&quot;&quot;
</span><del>-        Initialise this object from the store, based on its already-populated
-        resource ID. We read in and cache all the extra metadata from the DB to
-        avoid having to do DB queries for those individually later.
</del><ins>+        Retrieve the store identifier for this collection.
+
+        @return: store identifier.
+        @rtype: C{int}
</ins><span class="cx">         &quot;&quot;&quot;
</span><del>-        queryCacher = self._txn._queryCacher
-        if queryCacher:
-            # Retrieve from cache
-            cacheKey = queryCacher.keyForHomeChildMetaData(self._resourceID)
-            dataRows = yield queryCacher.get(cacheKey)
-        else:
-            dataRows = None
-        if dataRows is None:
-            # No cached copy
-            dataRows = (yield self._metadataByIDQuery.on(self._txn, resourceID=self._resourceID))[0]
-            if queryCacher:
-                # Cache the results
-                yield queryCacher.setAfterCommit(self._txn, cacheKey, dataRows)
</del><ins>+        return self._resourceID
</ins><span class="cx"> 
</span><del>-        if additionalBind:
-            for attr, value in zip(self.additionalBindAttributes(), additionalBind):
-                setattr(self, attr, value)
</del><span class="cx"> 
</span><del>-        for attr, value in zip(self.metadataAttributes(), dataRows):
-            setattr(self, attr, value)
-        yield self._loadPropertyStore()
</del><ins>+    def external_id(self):
+        &quot;&quot;&quot;
+        Retrieve the external store identifier for this collection.
</ins><span class="cx"> 
</span><ins>+        @return: a string.
+        &quot;&quot;&quot;
+        return self._externalID
</ins><span class="cx"> 
</span><del>-    def id(self):
</del><ins>+
+    def external(self):
</ins><span class="cx">         &quot;&quot;&quot;
</span><del>-        Retrieve the store identifier for this collection.
</del><ins>+        Is this an external home.
</ins><span class="cx"> 
</span><del>-        @return: store identifier.
-        @rtype: C{int}
</del><ins>+        @return: a string.
</ins><span class="cx">         &quot;&quot;&quot;
</span><del>-        return self._resourceID
</del><ins>+        return self.ownerHome().external()
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @property
</span><span class="lines">@@ -3986,10 +4338,6 @@
</span><span class="cx">         return self._txn.store().directoryService()
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def retrieveOldIndex(self):
-        return self._index
-
-
</del><span class="cx">     def __repr__(self):
</span><span class="cx">         return &quot;&lt;%s: %s&gt;&quot; % (self.__class__.__name__, self._resourceID)
</span><span class="cx"> 
</span><span class="lines">@@ -4024,14 +4372,13 @@
</span><span class="cx"> 
</span><span class="cx">         @return: a L{Deferred} which fires when the modification is complete.
</span><span class="cx">         &quot;&quot;&quot;
</span><ins>+
+        if self.isShared() or self.external():
+            raise ShareNotAllowed(&quot;Cannot rename a shared collection&quot;)
+
</ins><span class="cx">         oldName = self._name
</span><span class="cx"> 
</span><del>-        queryCacher = self._home._txn._queryCacher
-        if queryCacher:
-            cacheKey = queryCacher.keyForObjectWithName(self._home._resourceID, oldName)
-            yield queryCacher.invalidateAfterCommit(self._home._txn, cacheKey)
-            cacheKey = queryCacher.keyForObjectWithResourceID(self._home._resourceID, self._resourceID)
-            yield queryCacher.invalidateAfterCommit(self._home._txn, cacheKey)
</del><ins>+        yield self.invalidateQueryCache()
</ins><span class="cx"> 
</span><span class="cx">         yield self._renameQuery.on(self._txn, name=name,
</span><span class="cx">                                    resourceID=self._resourceID,
</span><span class="lines">@@ -4058,19 +4405,16 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def remove(self):
</span><span class="cx"> 
</span><ins>+        # Stop sharing first
+        yield self.ownerDeleteShare()
+
</ins><span class="cx">         # Do before setting _resourceID making changes
</span><span class="cx">         yield self.notifyPropertyChanged()
</span><span class="cx"> 
</span><del>-        queryCacher = self._home._txn._queryCacher
-        if queryCacher:
-            cacheKey = queryCacher.keyForObjectWithName(self._home._resourceID, self._name)
-            yield queryCacher.invalidateAfterCommit(self._home._txn, cacheKey)
-            cacheKey = queryCacher.keyForObjectWithResourceID(self._home._resourceID, self._resourceID)
-            yield queryCacher.invalidateAfterCommit(self._home._txn, cacheKey)
</del><ins>+        yield self.invalidateQueryCache()
</ins><span class="cx"> 
</span><span class="cx">         yield self._deletedSyncToken()
</span><del>-        yield self._deleteQuery.on(self._txn, NoSuchHomeChildError,
-                                   resourceID=self._resourceID)
</del><ins>+        yield self._deleteQuery.on(self._txn, NoSuchHomeChildError, resourceID=self._resourceID)
</ins><span class="cx">         yield self.properties()._removeResource()
</span><span class="cx"> 
</span><span class="cx">         # Set to non-existent state
</span><span class="lines">@@ -4122,6 +4466,7 @@
</span><span class="cx">         for result in results:
</span><span class="cx">             self._objects[result.name()] = result
</span><span class="cx">             self._objects[result.uid()] = result
</span><ins>+            self._objects[result.id()] = result
</ins><span class="cx">         self._objectNames = sorted([result.name() for result in results])
</span><span class="cx">         returnValue(results)
</span><span class="cx"> 
</span><span class="lines">@@ -4135,6 +4480,7 @@
</span><span class="cx">         for result in results:
</span><span class="cx">             self._objects[result.name()] = result
</span><span class="cx">             self._objects[result.uid()] = result
</span><ins>+            self._objects[result.id()] = result
</ins><span class="cx">         self._objectNames = sorted([result.name() for result in results])
</span><span class="cx">         returnValue(results)
</span><span class="cx"> 
</span><span class="lines">@@ -4171,8 +4517,7 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def countObjectResources(self):
</span><span class="cx">         if self._objectNames is None:
</span><del>-            rows = yield self._objectCountQuery.on(
-                self._txn, resourceID=self._resourceID)
</del><ins>+            rows = yield self._objectCountQuery.on(self._txn, resourceID=self._resourceID)
</ins><span class="cx">             returnValue(rows[0][0])
</span><span class="cx">         returnValue(len(self._objectNames))
</span><span class="cx"> 
</span><span class="lines">@@ -4204,18 +4549,13 @@
</span><span class="cx">         We create the empty object first then have it initialize itself from the
</span><span class="cx">         store.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        if resourceID:
-            objectResource = (
-                yield self._objectResourceClass.objectWithID(self, resourceID)
-            )
-        else:
-            objectResource = (
-                yield self._objectResourceClass.objectWithName(self, name, uid)
-            )
</del><ins>+        objectResource = (
+            yield self._objectResourceClass.objectWith(self, name=name, uid=uid, resourceID=resourceID)
+        )
</ins><span class="cx">         if objectResource:
</span><span class="cx">             self._objects[objectResource.name()] = objectResource
</span><span class="cx">             self._objects[objectResource.uid()] = objectResource
</span><del>-            self._objects[objectResource._resourceID] = objectResource
</del><ins>+            self._objects[objectResource.id()] = objectResource
</ins><span class="cx">         else:
</span><span class="cx">             if resourceID:
</span><span class="cx">                 self._objects[resourceID] = None
</span><span class="lines">@@ -4262,7 +4602,7 @@
</span><span class="cx">         obj = cls._objectSchema
</span><span class="cx">         return Select(
</span><span class="cx">             [obj.UID], From=obj,
</span><del>-            Where=(obj.UID == Parameter(&quot;name&quot;)
</del><ins>+            Where=(obj.RESOURCE_NAME == Parameter(&quot;name&quot;)
</ins><span class="cx">                   ).And(obj.PARENT_RESOURCE_ID == Parameter(&quot;resourceID&quot;)))
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -4305,6 +4645,7 @@
</span><span class="cx">         )
</span><span class="cx">         self._objects[objectResource.name()] = objectResource
</span><span class="cx">         self._objects[objectResource.uid()] = objectResource
</span><ins>+        self._objects[objectResource.id()] = objectResource
</ins><span class="cx"> 
</span><span class="cx">         # Note: create triggers a notification when the component is set, so we
</span><span class="cx">         # don't need to call notify() here like we do for object removal.
</span><span class="lines">@@ -4315,6 +4656,7 @@
</span><span class="cx">     def removedObjectResource(self, child):
</span><span class="cx">         self._objects.pop(child.name(), None)
</span><span class="cx">         self._objects.pop(child.uid(), None)
</span><ins>+        self._objects.pop(child.id(), None)
</ins><span class="cx">         if self._objectNames and child.name() in self._objectNames:
</span><span class="cx">             self._objectNames.remove(child.name())
</span><span class="cx">         yield self._deleteRevision(child.name())
</span><span class="lines">@@ -4347,10 +4689,9 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def moveObjectResource(self, child, newparent, newname=None):
</del><ins>+    def _validObjectResource(self, child, newparent, newname=None):
</ins><span class="cx">         &quot;&quot;&quot;
</span><del>-        Move a child of this collection into another collection without actually removing/re-inserting the data.
-        Make sure sync and cache details for both collections are updated.
</del><ins>+        Check that the move operation is valid
</ins><span class="cx"> 
</span><span class="cx">         TODO: check that the resource name does not exist in the new parent, or that the UID
</span><span class="cx">         does not exist there too.
</span><span class="lines">@@ -4364,7 +4705,6 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         name = child.name()
</span><del>-        uid = child.uid()
</del><span class="cx"> 
</span><span class="cx">         if newname is None:
</span><span class="cx">             newname = name
</span><span class="lines">@@ -4383,10 +4723,34 @@
</span><span class="cx">             if child_count &gt;= config.MaxResourcesPerCollection:
</span><span class="cx">                 raise TooManyObjectResourcesError()
</span><span class="cx"> 
</span><ins>+        returnValue(newname)
+
+
+    @inlineCallbacks
+    def moveObjectResource(self, child, newparent, newname=None):
+        &quot;&quot;&quot;
+        Move a child of this collection into another collection without actually removing/re-inserting the data.
+        Make sure sync and cache details for both collections are updated.
+
+        TODO: check that the resource name does not exist in the new parent, or that the UID
+        does not exist there too.
+
+        @param child: the child resource to move
+        @type child: L{CommonObjectResource}
+        @param newparent: the parent to move to
+        @type newparent: L{CommonHomeChild}
+        @param newname: new name to use in new parent
+        @type newname: C{str} or C{None} for existing name
+        &quot;&quot;&quot;
+
+        name = child.name()
+        newname = yield self._validObjectResource(child, newparent, newname)
+        uid = child.uid()
+
</ins><span class="cx">         # Clean this collections cache and signal sync change
</span><span class="cx">         self._objects.pop(name, None)
</span><span class="cx">         self._objects.pop(uid, None)
</span><del>-        self._objects.pop(child._resourceID, None)
</del><ins>+        self._objects.pop(child.id(), None)
</ins><span class="cx">         yield self._deleteRevision(name)
</span><span class="cx">         yield self.notifyChanged()
</span><span class="cx"> 
</span><span class="lines">@@ -4417,15 +4781,87 @@
</span><span class="cx">         # Signal sync change on new collection
</span><span class="cx">         newparent._objects.pop(name, None)
</span><span class="cx">         newparent._objects.pop(uid, None)
</span><del>-        newparent._objects.pop(child._resourceID, None)
</del><ins>+        newparent._objects.pop(child.id(), None)
</ins><span class="cx">         yield newparent._insertRevision(newname)
</span><span class="cx">         yield newparent.notifyChanged()
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
+    def moveObjectResourceCreateDelete(self, child, newparent, newname=None):
+        &quot;&quot;&quot;
+        Move a child of this collection into another collection by doing a create/delete.
+
+        TODO: check that the resource name does not exist in the new parent, or that the UID
+        does not exist there too.
+
+        @param child: the child resource to move
+        @type child: L{CommonObjectResource}
+        @param newparent: the parent to move to
+        @type newparent: L{CommonHomeChild}
+        @param newname: new name to use in new parent
+        @type newname: C{str} or C{None} for existing name
+        &quot;&quot;&quot;
+
+        name = child.name()
+        newname = yield self._validObjectResource(child, newparent, newname)
+
+        # Do a move as a create/delete
+        component = yield child.component()
+        yield newparent.moveObjectResourceHere(name, component)
+        yield self.moveObjectResourceAway(child.id(), child)
+
+
+    @inlineCallbacks
+    def moveObjectResourceHere(self, name, component):
+        &quot;&quot;&quot;
+        Create a new child in this collection as part of a move operation. This needs to be split out because
+        behavior differs for sub-classes and cross-pod operations.
+
+        @param name: new name to use in new parent
+        @type name: C{str} or C{None} for existing name
+        @param component: data for new resource
+        @type component: L{Component}
+        &quot;&quot;&quot;
+
+        yield self.createObjectResourceWithName(name, component)
+
+
+    @inlineCallbacks
+    def moveObjectResourceAway(self, rid, child=None):
+        &quot;&quot;&quot;
+        Remove the child as the result of a move operation. This needs to be split out because
+        behavior differs for sub-classes and cross-pod operations.
+
+        @param rid: the child resource-id to move
+        @type rid: C{int}
+        @param child: the child resource to move - might be C{None} for cross-pod
+        @type child: L{CommonObjectResource}
+        &quot;&quot;&quot;
+
+        if child is None:
+            child = yield self.objectResourceWithID(rid)
+        yield child.remove()
+
+
</ins><span class="cx">     def objectResourcesHaveProperties(self):
</span><span class="cx">         return False
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def search(self, filter):
+        &quot;&quot;&quot;
+        Do a query of the contents of this collection.
+
+        @param filter: the query filter to use
+        @type filter: L{Filter}
+
+        @return: the names of the matching resources
+        @rtype: C{list}
+        &quot;&quot;&quot;
+
+        # This implementation raises - sub-classes override to do the actual query
+        raise IndexedSearchException()
+
+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def sharedChildResourceNamesSinceRevision(self, revision, depth):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -4447,60 +4883,65 @@
</span><span class="cx">         @param depth: depth for determine what changed
</span><span class="cx">         @type depth: C{str}
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        assert not self.owned()
-
-        if revision != 0 and revision &lt; self._bindRevision:
-            if depth != '1':
-                raise SyncTokenValidException
-            else:
-                revision = 0
-
</del><span class="cx">         changed = set()
</span><span class="cx">         deleted = set()
</span><del>-        if revision:
-            rev = self._revisionsSchema
-            results = [
-                (
-                    self.name(),
-                    name if name else &quot;&quot;,
-                    wasdeleted
-                )
-                for name, wasdeleted in
-                (yield Select(
-                    [rev.RESOURCE_NAME, rev.DELETED],
-                    From=rev,
-                    Where=(rev.REVISION &gt; revision).And(
-                    rev.RESOURCE_ID == self._resourceID)
-                ).on(self._txn))
-                if name
-            ]
</del><ins>+        invalid = set()
+        if self.external():
+            if depth == &quot;1&quot;:
+                pass
+            else:
+                invalid.add(self.name() + &quot;/&quot;)
+        else:
+            if revision != 0 and revision &lt; self._bindRevision:
+                if depth != &quot;1&quot;:
+                    raise SyncTokenValidException
+                else:
+                    revision = 0
</ins><span class="cx"> 
</span><del>-            for path, name, wasdeleted in results:
-                if wasdeleted:
-                    if depth == &quot;1&quot;:
-                        changed.add(&quot;%s/&quot; % (path,))
-                    else:
-                        deleted.add(&quot;%s/%s&quot; % (path, name,))
</del><ins>+            if revision:
+                rev = self._revisionsSchema
+                results = [
+                    (
+                        self.name(),
+                        name if name else &quot;&quot;,
+                        wasdeleted
+                    )
+                    for name, wasdeleted in
+                    (yield Select(
+                        [rev.RESOURCE_NAME, rev.DELETED],
+                        From=rev,
+                        Where=(rev.REVISION &gt; revision).And(
+                        rev.RESOURCE_ID == self._resourceID)
+                    ).on(self._txn))
+                    if name
+                ]
</ins><span class="cx"> 
</span><ins>+                for path, name, wasdeleted in results:
+                    if wasdeleted:
+                        if depth == &quot;1&quot;:
+                            changed.add(&quot;%s/&quot; % (path,))
+                        else:
+                            deleted.add(&quot;%s/%s&quot; % (path, name,))
+
+                    # Always report collection as changed
+                    changed.add(&quot;%s/&quot; % (path,))
+
+                    # Resource changed - for depth &quot;infinity&quot; report resource as changed
+                    if depth != &quot;1&quot;:
+                        changed.add(&quot;%s/%s&quot; % (path, name,))
+            else:
+                path = self.name()
</ins><span class="cx">                 # Always report collection as changed
</span><span class="cx">                 changed.add(&quot;%s/&quot; % (path,))
</span><span class="cx"> 
</span><span class="cx">                 # Resource changed - for depth &quot;infinity&quot; report resource as changed
</span><span class="cx">                 if depth != &quot;1&quot;:
</span><del>-                    changed.add(&quot;%s/%s&quot; % (path, name,))
-        else:
-            path = self.name()
-            # Always report collection as changed
-            changed.add(&quot;%s/&quot; % (path,))
</del><ins>+                    for name in (yield self.listObjectResources()):
+                        changed.add(&quot;%s/%s&quot; % (path, name,))
</ins><span class="cx"> 
</span><del>-            # Resource changed - for depth &quot;infinity&quot; report resource as changed
-            if depth != &quot;1&quot;:
-                for name in (yield self.listObjectResources()):
-                    changed.add(&quot;%s/%s&quot; % (path, name,))
</del><ins>+        returnValue((changed, deleted, invalid,))
</ins><span class="cx"> 
</span><del>-        returnValue((changed, deleted))
</del><span class="cx"> 
</span><del>-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _loadPropertyStore(self, props=None):
</span><span class="cx">         if props is None:
</span><span class="lines">@@ -4680,10 +5121,85 @@
</span><span class="cx">         &quot;_parentCollection&quot;,
</span><span class="cx">     )
</span><span class="cx"> 
</span><ins>+    _externalClass = None
</ins><span class="cx">     _objectSchema = None
</span><ins>+    _componentClass = None
</ins><span class="cx"> 
</span><span class="cx">     BATCH_LOAD_SIZE = 50
</span><span class="cx"> 
</span><ins>+
+    @classmethod
+    @inlineCallbacks
+    def makeClass(cls, parent, objectData, propstore=None):
+        &quot;&quot;&quot;
+        Given the various database rows, build the actual class.
+
+        @param parent: the parent collection object
+        @type parent: L{CommonHomeChild}
+        @param objectData: the standard set of object columns
+        @type objectData: C{list}
+        @param propstore: a property store to use, or C{None} to load it automatically
+        @type propstore: L{PropertyStore}
+
+        @return: the constructed child class
+        @rtype: L{CommonHomeChild}
+        &quot;&quot;&quot;
+
+        c = cls._externalClass if parent.external() else cls
+        child = c(
+            parent,
+            objectData[cls._allColumns().index(cls._objectSchema.RESOURCE_NAME)],
+            objectData[cls._allColumns().index(cls._objectSchema.UID)],
+        )
+
+        for attr, value in zip(child._rowAttributes(), objectData):
+            setattr(child, attr, value)
+
+        yield child._loadPropertyStore(propstore)
+
+        returnValue(child)
+
+
+    @classmethod
+    @inlineCallbacks
+    def _getDBData(cls, parent, name, uid, resourceID):
+        &quot;&quot;&quot;
+        Given a set of identifying information, load the data rows for the object. Only one of
+        L{name}, L{uid} or L{resourceID} is specified - others are C{None}.
+
+        @param parent: the parent collection object
+        @type parent: L{CommonHomeChild}
+        @param name: the resource name
+        @type name: C{str}
+        @param uid: the UID of the data
+        @type uid: C{str}
+        @param resourceID: the resource ID
+        @type resourceID: C{int}
+        &quot;&quot;&quot;
+
+        rows = None
+        if name:
+            rows = yield cls._allColumnsWithParentAndName.on(
+                parent._txn,
+                name=name,
+                parentID=parent._resourceID
+            )
+        elif uid:
+            rows = yield cls._allColumnsWithParentAndUID.on(
+                parent._txn,
+                uid=uid,
+                parentID=parent._resourceID
+            )
+        elif resourceID:
+            rows = yield cls._allColumnsWithParentAndID.on(
+                parent._txn,
+                resourceID=resourceID,
+                parentID=parent._resourceID
+            )
+
+        returnValue(rows[0] if rows else None)
+
+
</ins><span class="cx">     def __init__(self, parent, name, uid, resourceID=None, options=None): #@UnusedVariable
</span><span class="cx">         self._parentCollection = parent
</span><span class="cx">         self._resourceID = resourceID
</span><span class="lines">@@ -4693,7 +5209,8 @@
</span><span class="cx">         self._size = None
</span><span class="cx">         self._created = None
</span><span class="cx">         self._modified = None
</span><del>-        self._notificationData = None
</del><ins>+        self._textData = None
+        self._cachedComponent = None
</ins><span class="cx"> 
</span><span class="cx">         self._locked = False
</span><span class="cx"> 
</span><span class="lines">@@ -4701,7 +5218,7 @@
</span><span class="cx">     @classproperty
</span><span class="cx">     def _allColumnsWithParentQuery(cls): #@NoSelf
</span><span class="cx">         obj = cls._objectSchema
</span><del>-        return Select(cls._allColumns, From=obj,
</del><ins>+        return Select(cls._allColumns(), From=obj,
</ins><span class="cx">                       Where=obj.PARENT_RESOURCE_ID == Parameter(&quot;parentID&quot;))
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -4742,11 +5259,10 @@
</span><span class="cx"> 
</span><span class="cx">         # Create the actual objects merging in properties
</span><span class="cx">         for row in dataRows:
</span><del>-            child = cls(parent, &quot;&quot;, None)
-            child._initFromRow(tuple(row))
-            yield child._loadPropertyStore(
-                props=propertyStores.get(child._resourceID, None)
-            )
</del><ins>+            resourceID = row[cls._allColumns().index(cls._objectSchema.RESOURCE_ID)]
+            propstore = propertyStores.get(resourceID, None)
+
+            child = yield cls.makeClass(parent, row, propstore=propstore)
</ins><span class="cx">             results.append(child)
</span><span class="cx"> 
</span><span class="cx">         returnValue(results)
</span><span class="lines">@@ -4756,7 +5272,9 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def loadAllObjectsWithNames(cls, parent, names):
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        Load all child objects with the specified names, doing so in batches.
</del><ins>+        Load all child objects with the specified names, doing so in batches (because we need to match
+        using SQL &quot;resource_name in (...)&quot; where there might be a character length limit on the number
+        of items in the set).
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         names = tuple(names)
</span><span class="cx">         results = []
</span><span class="lines">@@ -4771,7 +5289,7 @@
</span><span class="cx">     @classmethod
</span><span class="cx">     def _allColumnsWithParentAndNamesQuery(cls, names):
</span><span class="cx">         obj = cls._objectSchema
</span><del>-        return Select(cls._allColumns, From=obj,
</del><ins>+        return Select(cls._allColumns(), From=obj,
</ins><span class="cx">                       Where=(obj.PARENT_RESOURCE_ID == Parameter(&quot;parentID&quot;)).And(
</span><span class="cx">                           obj.RESOURCE_NAME.In(Parameter(&quot;names&quot;, len(names)))))
</span><span class="cx"> 
</span><span class="lines">@@ -4795,7 +5313,7 @@
</span><span class="cx"> 
</span><span class="cx">         # Optimize case of single name to load
</span><span class="cx">         if len(names) == 1:
</span><del>-            obj = yield cls.objectWithName(parent, names[0], None)
</del><ins>+            obj = yield cls.objectWithName(parent, names[0])
</ins><span class="cx">             returnValue([obj] if obj else [])
</span><span class="cx"> 
</span><span class="cx">         results = []
</span><span class="lines">@@ -4816,30 +5334,61 @@
</span><span class="cx"> 
</span><span class="cx">         # Create the actual objects merging in properties
</span><span class="cx">         for row in dataRows:
</span><del>-            child = cls(parent, &quot;&quot;, None)
-            child._initFromRow(tuple(row))
-            yield child._loadPropertyStore(
-                props=propertyStores.get(child._resourceID, None)
-            )
</del><ins>+            resourceID = row[cls._allColumns().index(cls._objectSchema.RESOURCE_ID)]
+            propstore = propertyStores.get(resourceID, None)
+
+            child = yield cls.makeClass(parent, row, propstore=propstore)
</ins><span class="cx">             results.append(child)
</span><span class="cx"> 
</span><span class="cx">         returnValue(results)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @classmethod
</span><del>-    def objectWithName(cls, parent, name, uid):
-        objectResource = cls(parent, name, uid, None)
-        return objectResource.initFromStore()
</del><ins>+    def objectWithName(cls, parent, name):
+        return cls.objectWith(parent, name=name)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @classmethod
</span><ins>+    def objectWithUID(cls, parent, uid):
+        return cls.objectWith(parent, uid=uid)
+
+
+    @classmethod
</ins><span class="cx">     def objectWithID(cls, parent, resourceID):
</span><del>-        objectResource = cls(parent, None, None, resourceID)
-        return objectResource.initFromStore()
</del><ins>+        return cls.objectWith(parent, resourceID=resourceID)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @classmethod
</span><span class="cx">     @inlineCallbacks
</span><ins>+    def objectWith(cls, parent, name=None, uid=None, resourceID=None):
+        &quot;&quot;&quot;
+        Create the object using one of the specified arguments as the key to load it. One
+        and only one of the keyword arguments must be set.
+
+        @param parent: parent collection
+        @type parent: L{CommonHomeChild}
+        @param name: name of the resource, or C{None}
+        @type name: C{str}
+        @param uid: resource data UID, or C{None}
+        @type uid: C{str}
+        @param resourceID: resource id
+        @type resourceID: C{int}
+
+        @return: the new object or C{None} if not found
+        @rtype: C{CommonObjectResource}
+        &quot;&quot;&quot;
+
+        row = yield cls._getDBData(parent, name, uid, resourceID)
+
+        if row:
+            child = yield cls.makeClass(parent, row)
+            returnValue(child)
+        else:
+            returnValue(None)
+
+
+    @classmethod
+    @inlineCallbacks
</ins><span class="cx">     def create(cls, parent, name, component, options=None):
</span><span class="cx"> 
</span><span class="cx">         child = (yield parent.objectResourceWithName(name))
</span><span class="lines">@@ -4849,13 +5398,13 @@
</span><span class="cx">         if name.startswith(&quot;.&quot;):
</span><span class="cx">             raise ObjectResourceNameNotAllowedError(name)
</span><span class="cx"> 
</span><del>-        objectResource = cls(parent, name, None, None, options=options)
</del><ins>+        c = cls._externalClass if parent.external() else cls
+        objectResource = c(parent, name, None, None, options=options)
</ins><span class="cx">         yield objectResource.setComponent(component, inserting=True)
</span><span class="cx">         yield objectResource._loadPropertyStore(created=True)
</span><span class="cx"> 
</span><span class="cx">         # Note: setComponent triggers a notification, so we don't need to
</span><span class="cx">         # call notify( ) here like we do for object removal.
</span><del>-
</del><span class="cx">         returnValue(objectResource)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -4866,7 +5415,7 @@
</span><span class="cx">         parameter and a given instance column matches a given parameter name.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         return Select(
</span><del>-            cls._allColumns, From=cls._objectSchema,
</del><ins>+            cls._allColumns(), From=cls._objectSchema,
</ins><span class="cx">             Where=(column == Parameter(paramName)).And(
</span><span class="cx">                 cls._objectSchema.PARENT_RESOURCE_ID == Parameter(&quot;parentID&quot;))
</span><span class="cx">         )
</span><span class="lines">@@ -4887,38 +5436,7 @@
</span><span class="cx">         return cls._allColumnsWithParentAnd(cls._objectSchema.RESOURCE_ID, &quot;resourceID&quot;)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    @inlineCallbacks
-    def initFromStore(self):
-        &quot;&quot;&quot;
-        Initialise this object from the store. We read in and cache all the
-        extra metadata from the DB to avoid having to do DB queries for those
-        individually later. Either the name or uid is present, so we have to
-        tweak the query accordingly.
-
-        @return: L{self} if object exists in the DB, else C{None}
-        &quot;&quot;&quot;
-
-        if self._name:
-            rows = yield self._allColumnsWithParentAndName.on(
-                self._txn, name=self._name,
-                parentID=self._parentCollection._resourceID)
-        elif self._uid:
-            rows = yield self._allColumnsWithParentAndUID.on(
-                self._txn, uid=self._uid,
-                parentID=self._parentCollection._resourceID)
-        elif self._resourceID:
-            rows = yield self._allColumnsWithParentAndID.on(
-                self._txn, resourceID=self._resourceID,
-                parentID=self._parentCollection._resourceID)
-        if rows:
-            self._initFromRow(tuple(rows[0]))
-            yield self._loadPropertyStore()
-            returnValue(self)
-        else:
-            returnValue(None)
-
-
-    @classproperty
</del><ins>+    @classmethod
</ins><span class="cx">     def _allColumns(cls): #@NoSelf
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Full set of columns in the object table that need to be loaded to
</span><span class="lines">@@ -4936,21 +5454,52 @@
</span><span class="cx">         ]
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def _initFromRow(self, row):
</del><ins>+    @classmethod
+    def _rowAttributes(cls): #@NoSelf
+        return (
+            &quot;_resourceID&quot;,
+            &quot;_name&quot;,
+            &quot;_uid&quot;,
+            &quot;_md5&quot;,
+            &quot;_size&quot;,
+            &quot;_created&quot;,
+            &quot;_modified&quot;,
+        )
+
+
+    @classmethod
+    def _otherSerializedAttributes(cls): #@NoSelf
+        return (
+            &quot;_componentChanged&quot;,
+        )
+
+
+    def externalize(self):
</ins><span class="cx">         &quot;&quot;&quot;
</span><del>-        Given a select result using the columns from L{_allColumns}, initialize
-        the object resource state.
</del><ins>+        Create a dictionary mapping key attributes so this object can be sent over a cross-pod call
+        and reconstituted at the other end. Note that the other end may have a different schema so
+        the attributes may not match exactly and will need to be processed accordingly.
</ins><span class="cx">         &quot;&quot;&quot;
</span><del>-        (self._resourceID,
-         self._name,
-         self._uid,
-         self._md5,
-         self._size,
-         self._created,
-         self._modified,) = tuple(row)
</del><ins>+        return dict([(attr[1:], getattr(self, attr, None)) for attr in itertools.chain(self._rowAttributes(), self._otherSerializedAttributes())])
</ins><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @classmethod
</ins><span class="cx">     @inlineCallbacks
</span><ins>+    def internalize(cls, parent, mapping):
+        &quot;&quot;&quot;
+        Given a mapping generated by L{externalize}, convert the values into an array of database
+        like items that conforms to the ordering of L{_allColumns} so it can be fed into L{makeClass}.
+        Note that there may be a schema mismatch with the external data, so treat missing items as
+        C{None} and ignore extra items.
+        &quot;&quot;&quot;
+
+        child = yield cls.makeClass(parent, [mapping.get(row[1:]) for row in cls._rowAttributes()])
+        for attr in cls._otherSerializedAttributes():
+            setattr(child, attr, mapping.get(attr[1:]))
+        returnValue(child)
+
+
+    @inlineCallbacks
</ins><span class="cx">     def _loadPropertyStore(self, props=None, created=False):
</span><span class="cx">         if props is None:
</span><span class="cx">             if self._parentCollection.objectResourcesHaveProperties():
</span><span class="lines">@@ -5060,7 +5609,7 @@
</span><span class="cx">         self._locked = True
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def setComponent(self, component, inserting=False, options=None):
</del><ins>+    def setComponent(self, component, inserting=False):
</ins><span class="cx">         raise NotImplementedError
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -5093,9 +5642,15 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         yield self.moveValidation(destination, name)
</span><del>-        yield self._parentCollection.moveObjectResource(self, destination, name)
</del><span class="cx"> 
</span><ins>+        # If possible we do a &quot;fast&quot; move by simply fixing up the database information directly rather than
+        # re-writing any data. That is only possible when the source and destination are on this pod.
+        if not self._parentCollection.external() and not destination.external():
+            yield self._parentCollection.moveObjectResource(self, destination, name)
+        else:
+            yield self._parentCollection.moveObjectResourceCreateDelete(self, destination, name)
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def moveValidation(self, destination, name):
</span><span class="cx">         raise NotImplementedError
</span><span class="cx"> 
</span><span class="lines">@@ -5116,7 +5671,8 @@
</span><span class="cx">         self._size = None
</span><span class="cx">         self._created = None
</span><span class="cx">         self._modified = None
</span><del>-        self._notificationData = None
</del><ins>+        self._textData = None
+        self._cachedComponent = None
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def removeNotifyCategory(self):
</span><span class="lines">@@ -5172,19 +5728,19 @@
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _text(self):
</span><del>-        if self._notificationData is None:
</del><ins>+        if self._textData is None:
</ins><span class="cx">             texts = (
</span><span class="cx">                 yield self._textByIDQuery.on(self._txn,
</span><span class="cx">                                              resourceID=self._resourceID)
</span><span class="cx">             )
</span><span class="cx">             if texts:
</span><span class="cx">                 text = texts[0][0]
</span><del>-                self._notificationData = text
</del><ins>+                self._textData = text
</ins><span class="cx">                 returnValue(text)
</span><span class="cx">             else:
</span><span class="cx">                 raise ConcurrentModification()
</span><span class="cx">         else:
</span><del>-            returnValue(self._notificationData)
</del><ins>+            returnValue(self._textData)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -5248,6 +5804,15 @@
</span><span class="cx">             resourceID = rows[0][0]
</span><span class="cx">             created = False
</span><span class="cx">         elif create:
</span><ins>+            # Determine if the user is local or external
+            record = txn.directoryService().recordWithUID(uid)
+            if record is None:
+                raise DirectoryRecordNotFoundError(&quot;Cannot create home for UID since no directory record exists: {}&quot;.format(uid))
+
+            state = _HOME_STATUS_NORMAL if record.thisServer() else _HOME_STATUS_EXTERNAL
+            if state == _HOME_STATUS_EXTERNAL:
+                raise RecordNotAllowedError(&quot;Cannot store notifications for external user: {}&quot;.format(uid))
+
</ins><span class="cx">             # Use savepoint so we can do a partial rollback if there is a race
</span><span class="cx">             # condition where this row has already been inserted
</span><span class="cx">             savepoint = SavepointAction(&quot;notificationsWithUID&quot;)
</span><span class="lines">@@ -5370,6 +5935,7 @@
</span><span class="cx">         Where=schema.NOTIFICATION.NOTIFICATION_HOME_RESOURCE_ID ==
</span><span class="cx">         Parameter(&quot;resourceID&quot;))
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def listNotificationObjects(self):
</span><span class="cx">         if self._notificationNames is None:
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_dumppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_dump.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_dump.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_dump.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.common.datastore.test.test_sql_tables -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_externalpyfromrev12321CalendarServertrunktxdavcommondatastoresql_externalpy"></a>
<div class="copfile"><h4>Copied: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_external.py (from rev 12321, CalendarServer/trunk/txdav/common/datastore/sql_external.py) (0 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_external.py                                (rev 0)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_external.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -0,0 +1,470 @@
</span><ins>+# -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
+##
+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+&quot;&quot;&quot;
+SQL data store.
+&quot;&quot;&quot;
+
+from twext.internet.decorate import memoizedKey
+from twext.python.log import Logger
+
+from twisted.internet.defer import inlineCallbacks, returnValue, succeed
+
+from txdav.base.propertystore.sql import PropertyStore
+from txdav.common.datastore.sql import CommonHome, CommonHomeChild, \
+    CommonObjectResource
+from txdav.common.datastore.sql_tables import _HOME_STATUS_EXTERNAL
+from txdav.common.icommondatastore import NonExistentExternalShare, \
+    ExternalShareFailed
+
+
+log = Logger()
+
+class CommonHomeExternal(CommonHome):
+    &quot;&quot;&quot;
+    A CommonHome for a user not hosted on this system, but on another pod. This is needed to provide a
+    &quot;reference&quot; to the external user so we can share with them. Actual operations to list child resources, etc
+    are all stubbed out since no data for the user is actually hosted in this store.
+    &quot;&quot;&quot;
+
+    def __init__(self, transaction, ownerUID, resourceID):
+        super(CommonHomeExternal, self).__init__(transaction, ownerUID)
+        self._resourceID = resourceID
+        self._status = _HOME_STATUS_EXTERNAL
+
+
+    def initFromStore(self, no_cache=False):
+        &quot;&quot;&quot;
+        Never called - this should be done by CommonHome.initFromStore only.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def external(self):
+        &quot;&quot;&quot;
+        Is this an external home.
+
+        @return: a string.
+        &quot;&quot;&quot;
+        return True
+
+
+    def children(self):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def loadChildren(self):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def listChildren(self):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def objectWithShareUID(self, shareUID):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def invitedObjectWithShareUID(self, shareUID):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    @memoizedKey(&quot;name&quot;, &quot;_children&quot;)
+    @inlineCallbacks
+    def createChildWithName(self, name, externalID=None):
+        &quot;&quot;&quot;
+        No real children - only external ones.
+        &quot;&quot;&quot;
+        if externalID is None:
+            raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+        child = yield super(CommonHomeExternal, self).createChildWithName(name, externalID)
+        returnValue(child)
+
+
+    def removeChildWithName(self, name):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    @inlineCallbacks
+    def removeExternalChild(self, child):
+        &quot;&quot;&quot;
+        Remove an external child. Check that it is invalid or unused before calling this because if there
+        are valid references to it, removing will break things.
+        &quot;&quot;&quot;
+        if child._externalID is None:
+            raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+        yield super(CommonHomeExternal, self).removeChildWithName(child.name())
+
+
+    def syncToken(self):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def resourceNamesSinceRevision(self, revision, depth):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    @inlineCallbacks
+    def _loadPropertyStore(self):
+        &quot;&quot;&quot;
+        No property store - stub to a NonePropertyStore.
+        &quot;&quot;&quot;
+        props = yield PropertyStore.load(
+            self.uid(),
+            self.uid(),
+            self._txn,
+            self._resourceID,
+            notifyCallback=self.notifyChanged
+        )
+        self._propertyStore = props
+
+
+    def properties(self):
+        return self._propertyStore
+
+
+    def objectResourcesWithUID(self, uid, ignore_children=[], allowShared=True):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def objectResourceWithID(self, rid):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+    def notifyChanged(self):
+        &quot;&quot;&quot;
+        Notifications are not handled for external homes - make this a no-op.
+        &quot;&quot;&quot;
+        return succeed(None)
+
+
+    def bumpModified(self):
+        &quot;&quot;&quot;
+        No changes recorded for external homes - make this a no-op.
+        &quot;&quot;&quot;
+        return succeed(None)
+
+
+    def removeUnacceptedShares(self):
+        &quot;&quot;&quot;
+        No children.
+        &quot;&quot;&quot;
+        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+#    def ownerHomeAndChildNameForChildID(self, resourceID):
+#        &quot;&quot;&quot;
+#        No children.
+#        &quot;&quot;&quot;
+#        raise AssertionError(&quot;CommonHomeExternal: not supported&quot;)
+
+
+
+class CommonHomeChildExternal(CommonHomeChild):
+    &quot;&quot;&quot;
+    A CommonHomeChild for a collection not hosted on this system, but on another pod. This will forward
+    specific apis to the other pod using cross-pod requests.
+    &quot;&quot;&quot;
+
+    def external(self):
+        &quot;&quot;&quot;
+        Is this an external home.
+
+        @return: a string.
+        &quot;&quot;&quot;
+        return True
+
+
+    def fixNonExistentExternalShare(self):
+        &quot;&quot;&quot;
+        An external request has returned and indicates the external share no longer exists. That
+        means this shared resource is an &quot;orphan&quot; and needs to be remove (uninvited) to clean things up.
+        &quot;&quot;&quot;
+        log.error(&quot;Non-existent share detected and removed for {share}&quot;, share=self)
+        ownerView = yield self.ownerView()
+        yield ownerView.removeShare(self)
+
+
+    @inlineCallbacks
+    def remove(self):
+        &quot;&quot;&quot;
+        External shares are never removed directly - instead they must be &quot;uninvited&quot;. However,
+        the owner's external calendar can be removed.
+        &quot;&quot;&quot;
+        if self.owned():
+            yield super(CommonHomeChildExternal, self).remove()
+        else:
+            raise AssertionError(&quot;CommonHomeChildExternal: not supported&quot;)
+
+
+    @inlineCallbacks
+    def listObjectResources(self):
+        if self._objectNames is None:
+            try:
+                self._objectNames = yield self._txn.store().conduit.send_listobjects(self)
+            except NonExistentExternalShare:
+                yield self.fixNonExistentExternalShare()
+                raise ExternalShareFailed(&quot;External share does not exist&quot;)
+
+        returnValue(self._objectNames)
+
+
+    @inlineCallbacks
+    def countObjectResources(self):
+        if self._objectNames is None:
+            try:
+                count = yield self._txn.store().conduit.send_countobjects(self)
+            except NonExistentExternalShare:
+                yield self.fixNonExistentExternalShare()
+                raise ExternalShareFailed(&quot;External share does not exist&quot;)
+            returnValue(count)
+        returnValue(len(self._objectNames))
+
+
+    @inlineCallbacks
+    def resourceNameForUID(self, uid):
+        try:
+            resource = self._objects[uid]
+            returnValue(resource.name() if resource else None)
+        except KeyError:
+            pass
+
+        try:
+            name = yield self._txn.store().conduit.send_resourcenameforuid(self, uid)
+        except NonExistentExternalShare:
+            yield self.fixNonExistentExternalShare()
+            raise ExternalShareFailed(&quot;External share does not exist&quot;)
+
+        if name:
+            returnValue(name)
+        else:
+            self._objects[uid] = None
+            returnValue(None)
+
+
+    @inlineCallbacks
+    def resourceUIDForName(self, name):
+        try:
+            resource = self._objects[name]
+            returnValue(resource.uid() if resource else None)
+        except KeyError:
+            pass
+
+        try:
+            uid = yield self._txn.store().conduit.send_resourceuidforname(self, name)
+        except NonExistentExternalShare:
+            yield self.fixNonExistentExternalShare()
+            raise ExternalShareFailed(&quot;External share does not exist&quot;)
+
+        if uid:
+            returnValue(uid)
+        else:
+            self._objects[name] = None
+            returnValue(None)
+
+
+    @inlineCallbacks
+    def moveObjectResource(self, child, newparent, newname=None):
+        &quot;&quot;&quot;
+        The base class does an optimization to avoid removing/re-creating
+        the actual object resource data. That might not always be possible
+        with external shares if the shared resource is moved to a collection
+        that is not shared or shared by someone else on a different (third)
+        pod. The best bet here is to treat the move as a delete/create.
+        &quot;&quot;&quot;
+        raise NotImplementedError(&quot;TODO: external resource&quot;)
+
+
+    @inlineCallbacks
+    def moveObjectResourceHere(self, name, component):
+        &quot;&quot;&quot;
+        Create a new child in this collection as part of a move operation. This needs to be split out because
+        behavior differs for sub-classes and cross-pod operations.
+
+        @param name: new name to use in new parent
+        @type name: C{str} or C{None} for existing name
+        @param component: data for new resource
+        @type component: L{Component}
+        &quot;&quot;&quot;
+
+        try:
+            result = yield self._txn.store().conduit.send_movehere(self, name, str(component))
+        except NonExistentExternalShare:
+            yield self.fixNonExistentExternalShare()
+            raise ExternalShareFailed(&quot;External share does not exist&quot;)
+        returnValue(result)
+
+
+    @inlineCallbacks
+    def moveObjectResourceAway(self, rid, child=None):
+        &quot;&quot;&quot;
+        Remove the child as the result of a move operation. This needs to be split out because
+        behavior differs for sub-classes and cross-pod operations.
+
+        @param rid: the child resource-id to move
+        @type rid: C{int}
+        @param child: the child resource to move - might be C{None} for cross-pod
+        @type child: L{CommonObjectResource}
+        &quot;&quot;&quot;
+
+        try:
+            result = yield self._txn.store().conduit.send_moveaway(self, rid)
+        except NonExistentExternalShare:
+            yield self.fixNonExistentExternalShare()
+            raise ExternalShareFailed(&quot;External share does not exist&quot;)
+        returnValue(result)
+
+
+    @inlineCallbacks
+    def syncToken(self):
+        if self._syncTokenRevision is None:
+            try:
+                token = yield self._txn.store().conduit.send_synctoken(self)
+                self._syncTokenRevision = self.revisionFromToken(token)
+            except NonExistentExternalShare:
+                yield self.fixNonExistentExternalShare()
+                raise ExternalShareFailed(&quot;External share does not exist&quot;)
+        returnValue((&quot;%s_%s&quot; % (self._externalID, self._syncTokenRevision,)))
+
+
+    @inlineCallbacks
+    def resourceNamesSinceRevision(self, revision):
+        try:
+            names = yield self._txn.store().conduit.send_resourcenamessincerevision(self, revision)
+        except NonExistentExternalShare:
+            yield self.fixNonExistentExternalShare()
+            raise ExternalShareFailed(&quot;External share does not exist&quot;)
+
+        returnValue(names)
+
+
+    @inlineCallbacks
+    def search(self, filter, **kwargs):
+        try:
+            results = yield self._txn.store().conduit.send_search(self, filter.serialize(), **kwargs)
+        except NonExistentExternalShare:
+            yield self.fixNonExistentExternalShare()
+            raise ExternalShareFailed(&quot;External share does not exist&quot;)
+
+        returnValue(results)
+
+
+
+class CommonObjectResourceExternal(CommonObjectResource):
+    &quot;&quot;&quot;
+    A CommonObjectResource for a resource not hosted on this system, but on another pod. This will forward
+    specific apis to the other pod using cross-pod requests.
+    &quot;&quot;&quot;
+
+    @classmethod
+    @inlineCallbacks
+    def loadAllObjects(cls, parent):
+        mapping_list = yield parent._txn.store().conduit.send_loadallobjects(parent, None)
+
+        results = []
+        if mapping_list:
+            for mapping in mapping_list:
+                child = yield cls.internalize(parent, mapping)
+                results.append(child)
+        returnValue(results)
+
+
+    @classmethod
+    @inlineCallbacks
+    def loadAllObjectsWithNames(cls, parent, names):
+        mapping_list = yield parent._txn.store().conduit.send_loadallobjectswithnames(parent, None, names)
+
+        results = []
+        if mapping_list:
+            for mapping in mapping_list:
+                child = yield cls.internalize(parent, mapping)
+                results.append(child)
+        returnValue(results)
+
+
+    @classmethod
+    @inlineCallbacks
+    def objectWith(cls, parent, name=None, uid=None, resourceID=None):
+        mapping = yield parent._txn.store().conduit.send_objectwith(parent, None, name, uid, resourceID)
+
+        if mapping:
+            child = yield cls.internalize(parent, mapping)
+            returnValue(child)
+        else:
+            returnValue(None)
+
+
+    @classmethod
+    @inlineCallbacks
+    def create(cls, parent, name, component, options=None):
+        mapping = yield parent._txn.store().conduit.send_create(parent, None, name, str(component), options=options)
+
+        if mapping:
+            child = yield cls.internalize(parent, mapping)
+            returnValue(child)
+        else:
+            returnValue(None)
+
+
+    @inlineCallbacks
+    def setComponent(self, component, **kwargs):
+        self._componentChanged = yield self._txn.store().conduit.send_setcomponent(self.parentCollection(), self, str(component), **kwargs)
+        self._cachedComponent = None
+        returnValue(self._componentChanged)
+
+
+    @inlineCallbacks
+    def component(self):
+        if self._cachedComponent is None:
+            text = yield self._txn.store().conduit.send_component(self.parentCollection(), self)
+            self._cachedComponent = self._componentClass.fromString(text)
+
+        returnValue(self._cachedComponent)
+
+
+    @inlineCallbacks
+    def remove(self):
+        yield self._txn.store().conduit.send_remove(self.parentCollection(), self)
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_legacypy"></a>
<div class="delfile"><h4>Deleted: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_legacy.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_legacy.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_legacy.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,886 +0,0 @@
</span><del>-# -*- test-case-name: twistedcaldav.test.test_sharing,twistedcaldav.test.test_calendarquery -*-
-##
-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-
-
-&quot;&quot;&quot;
-PostgreSQL data store.
-&quot;&quot;&quot;
-
-import StringIO
-
-
-from twisted.python import hashlib
-from twisted.internet.defer import succeed, inlineCallbacks, returnValue
-
-from twistedcaldav.config import config
-from twistedcaldav.dateops import normalizeForIndex, pyCalendarTodatetime
-from twistedcaldav.memcachepool import CachePoolUserMixIn
-from twistedcaldav.query import \
-    calendarqueryfilter, calendarquery, addressbookquery, expression, \
-    addressbookqueryfilter
-from twistedcaldav.query.sqlgenerator import sqlgenerator
-
-from txdav.caldav.icalendarstore import TimeRangeLowerLimit, TimeRangeUpperLimit
-from txdav.common.icommondatastore import IndexedSearchException, \
-    ReservationError, NoSuchObjectResourceError
-
-from txdav.common.datastore.sql_tables import schema
-from twext.enterprise.dal.syntax import Parameter, Select
-from twext.python.clsprop import classproperty
-from twext.python.log import Logger
-
-from pycalendar.datetime import DateTime
-from pycalendar.duration import Duration
-
-log = Logger()
-
-indexfbtype_to_icalfbtype = {
-    0: '?',
-    1: 'F',
-    2: 'B',
-    3: 'U',
-    4: 'T',
-}
-
-class MemcachedUIDReserver(CachePoolUserMixIn):
-    log = Logger()
-
-    def __init__(self, index, cachePool=None):
-        self.index = index
-        self._cachePool = cachePool
-
-
-    def _key(self, uid):
-        return 'reservation:%s' % (
-            hashlib.md5('%s:%s' % (uid,
-                                   self.index.resource._resourceID)).hexdigest())
-
-
-    def reserveUID(self, uid):
-        self.log.debug(&quot;Reserving UID %r @ %r&quot; % (
-                uid,
-                self.index.resource))
-
-        def _handleFalse(result):
-            if result is False:
-                raise ReservationError(
-                    &quot;UID %s already reserved for calendar collection %s.&quot;
-                    % (uid, self.index.resource._name)
-                    )
-
-        d = self.getCachePool().add(self._key(uid),
-                                    'reserved',
-                                    expireTime=config.UIDReservationTimeOut)
-        d.addCallback(_handleFalse)
-        return d
-
-
-    def unreserveUID(self, uid):
-        self.log.debug(&quot;Unreserving UID %r @ %r&quot; % (
-                uid,
-                self.index.resource))
-
-        def _handleFalse(result):
-            if result is False:
-                raise ReservationError(
-                    &quot;UID %s is not reserved for calendar collection %s.&quot;
-                    % (uid, self.index.resource._resourceID)
-                    )
-
-        d = self.getCachePool().delete(self._key(uid))
-        d.addCallback(_handleFalse)
-        return d
-
-
-    def isReservedUID(self, uid):
-        self.log.debug(&quot;Is reserved UID %r @ %r&quot; % (
-                uid,
-                self.index.resource))
-
-        def _checkValue((flags, value)):
-            if value is None:
-                return False
-            else:
-                return True
-
-        d = self.getCachePool().get(self._key(uid))
-        d.addCallback(_checkValue)
-        return d
-
-
-
-class DummyUIDReserver(object):
-    log = Logger()
-
-    def __init__(self, index):
-        self.index = index
-        self.reservations = set()
-
-
-    def _key(self, uid):
-        return 'reservation:%s' % (
-            hashlib.md5('%s:%s' % (uid,
-                                   self.index.resource._resourceID)).hexdigest())
-
-
-    def reserveUID(self, uid):
-        self.log.debug(&quot;Reserving UID %r @ %r&quot; % (
-                uid,
-                self.index.resource))
-
-        key = self._key(uid)
-        if key in self.reservations:
-            raise ReservationError(
-                &quot;UID %s already reserved for calendar collection %s.&quot;
-                % (uid, self.index.resource._name)
-                )
-        self.reservations.add(key)
-        return succeed(None)
-
-
-    def unreserveUID(self, uid):
-        self.log.debug(&quot;Unreserving UID %r @ %r&quot; % (
-                uid,
-                self.index.resource))
-
-        key = self._key(uid)
-        if key in self.reservations:
-            self.reservations.remove(key)
-        return succeed(None)
-
-
-    def isReservedUID(self, uid):
-        self.log.debug(&quot;Is reserved UID %r @ %r&quot; % (
-                uid,
-                self.index.resource))
-        key = self._key(uid)
-        return succeed(key in self.reservations)
-
-
-
-class RealSQLBehaviorMixin(object):
-    &quot;&quot;&quot;
-    Class attributes for 'real' SQL behavior; avoid idiosyncracies of SQLite,
-    use standard SQL constructions, and depend on the full schema in
-    sql_schema/current.sql rather than the partial one in twistedcaldav which depends
-    on the placement of the database in the filesystem for some information.
-    &quot;&quot;&quot;
-
-    ISOP = &quot; = &quot;
-    STARTSWITHOP = ENDSWITHOP = CONTAINSOP = &quot; LIKE &quot;
-    NOTSTARTSWITHOP = NOTENDSWITHOP = NOTCONTAINSOP = &quot; NOT LIKE &quot;
-
-    def containsArgument(self, arg):
-        return &quot;%%%s%%&quot; % (arg,)
-
-
-    def startswithArgument(self, arg):
-        return &quot;%s%%&quot; % (arg,)
-
-
-    def endswithArgument(self, arg):
-        return &quot;%%%s&quot; % (arg,)
-
-
-
-class CalDAVSQLBehaviorMixin(RealSQLBehaviorMixin):
-    &quot;&quot;&quot;
-    Query generator for CalDAV indexed searches.
-    &quot;&quot;&quot;
-
-    FIELDS = {
-        &quot;TYPE&quot;: &quot;CALENDAR_OBJECT.ICALENDAR_TYPE&quot;,
-        &quot;UID&quot;: &quot;CALENDAR_OBJECT.ICALENDAR_UID&quot;,
-    }
-    RESOURCEDB = &quot;CALENDAR_OBJECT&quot;
-    TIMESPANDB = &quot;TIME_RANGE&quot;
-
-    TIMESPANTEST = &quot;((TIME_RANGE.FLOATING = FALSE AND TIME_RANGE.START_DATE &lt; %s AND TIME_RANGE.END_DATE &gt; %s) OR (TIME_RANGE.FLOATING = TRUE AND TIME_RANGE.START_DATE &lt; %s AND TIME_RANGE.END_DATE &gt; %s))&quot;
-    TIMESPANTEST_NOEND = &quot;((TIME_RANGE.FLOATING = FALSE AND TIME_RANGE.END_DATE &gt; %s) OR (TIME_RANGE.FLOATING = TRUE AND TIME_RANGE.END_DATE &gt; %s))&quot;
-    TIMESPANTEST_NOSTART = &quot;((TIME_RANGE.FLOATING = FALSE AND TIME_RANGE.START_DATE &lt; %s) OR (TIME_RANGE.FLOATING = TRUE AND TIME_RANGE.START_DATE &lt; %s))&quot;
-    TIMESPANTEST_TAIL_PIECE = &quot; AND TIME_RANGE.CALENDAR_OBJECT_RESOURCE_ID = CALENDAR_OBJECT.RESOURCE_ID AND TIME_RANGE.CALENDAR_RESOURCE_ID = %s&quot;
-    TIMESPANTEST_JOIN_ON_PIECE = &quot;TIME_RANGE.INSTANCE_ID = TRANSPARENCY.TIME_RANGE_INSTANCE_ID AND TRANSPARENCY.USER_ID = %s&quot;
-
-    def generate(self):
-        &quot;&quot;&quot;
-        Generate the actual SQL 'where ...' expression from the passed in
-        expression tree.
-
-        @return: a C{tuple} of (C{str}, C{list}), where the C{str} is the
-            partial SQL statement, and the C{list} is the list of argument
-            substitutions to use with the SQL API execute method.
-        &quot;&quot;&quot;
-
-        # Init state
-        self.sout = StringIO.StringIO()
-        self.arguments = []
-        self.substitutions = []
-        self.usedtimespan = False
-
-        # For SQL data DB we need to restrict the query to just the targeted calendar resource-id if provided
-        if self.calendarid:
-
-            test = expression.isExpression(&quot;CALENDAR_OBJECT.CALENDAR_RESOURCE_ID&quot;, str(self.calendarid), True)
-
-            # Since timerange expression already have the calendar resource-id test in them, do not
-            # add the additional term to those. When the additional term is added, add it as the first
-            # component in the AND expression to hopefully get the DB to use its index first
-
-            # Top-level timerange expression already has calendar resource-id restriction in it
-            if isinstance(self.expression, expression.timerangeExpression):
-                pass
-
-            # Top-level OR - check each component
-            elif isinstance(self.expression, expression.orExpression):
-
-                def _hasTopLevelTimerange(testexpr):
-                    if isinstance(testexpr, expression.timerangeExpression):
-                        return True
-                    elif isinstance(testexpr, expression.andExpression):
-                        return any([isinstance(expr, expression.timerangeExpression) for expr in testexpr.expressions])
-                    else:
-                        return False
-
-                hasTimerange = any([_hasTopLevelTimerange(expr) for expr in self.expression.expressions])
-
-                if hasTimerange:
-                    # timerange expression forces a join on calendarid
-                    pass
-                else:
-                    # AND the whole thing with calendarid
-                    self.expression = test.andWith(self.expression)
-
-            # Top-level AND - only add additional expression if timerange not present
-            elif isinstance(self.expression, expression.andExpression):
-                hasTimerange = any([isinstance(expr, expression.timerangeExpression) for expr in self.expression.expressions])
-                if not hasTimerange:
-                    # AND the whole thing
-                    self.expression = test.andWith(self.expression)
-
-            # Just AND the entire thing
-            else:
-                self.expression = test.andWith(self.expression)
-
-        # Generate ' where ...' partial statement
-        self.generateExpression(self.expression)
-
-        # Prefix with ' from ...' partial statement
-        select = self.FROM + self.RESOURCEDB
-        if self.usedtimespan:
-
-            # Free busy needs transparency join
-            if self.freebusy:
-                self.frontArgument(self.userid)
-                select += &quot;, %s LEFT OUTER JOIN %s ON (%s)&quot; % (
-                    self.TIMESPANDB,
-                    self.TRANSPARENCYDB,
-                    self.TIMESPANTEST_JOIN_ON_PIECE
-                )
-            else:
-                select += &quot;, %s&quot; % (
-                    self.TIMESPANDB,
-                )
-        select += self.WHERE
-        if self.usedtimespan:
-            select += &quot;(&quot;
-        select += self.sout.getvalue()
-        if self.usedtimespan:
-            if self.calendarid:
-                self.setArgument(self.calendarid)
-            select += &quot;)%s&quot; % (self.TIMESPANTEST_TAIL_PIECE,)
-
-        select = select % tuple(self.substitutions)
-
-        return select, self.arguments
-
-
-
-class FormatParamStyleMixin(object):
-    &quot;&quot;&quot;
-    Mixin for overriding methods on sqlgenerator that generate arguments
-    according to format/pyformat rules rather than the base class's 'numeric'
-    rules.
-    &quot;&quot;&quot;
-
-    def addArgument(self, arg):
-        self.arguments.append(arg)
-        self.substitutions.append(&quot;%s&quot;)
-        self.sout.write(&quot;%s&quot;)
-
-
-    def setArgument(self, arg):
-        self.arguments.append(arg)
-        self.substitutions.append(&quot;%s&quot;)
-
-
-    def frontArgument(self, arg):
-        self.arguments.insert(0, arg)
-        self.substitutions.insert(0, &quot;%s&quot;)
-
-
-
-class postgresqlgenerator(FormatParamStyleMixin, CalDAVSQLBehaviorMixin,
-                          sqlgenerator):
-    &quot;&quot;&quot;
-    Query generator for PostgreSQL indexed searches.
-    &quot;&quot;&quot;
-
-
-
-def fixbools(sqltext):
-    return sqltext.replace(&quot;TRUE&quot;, &quot;1&quot;).replace(&quot;FALSE&quot;, &quot;0&quot;)
-
-
-
-class oraclesqlgenerator(CalDAVSQLBehaviorMixin, sqlgenerator):
-    &quot;&quot;&quot;
-    Query generator for Oracle indexed searches.
-    &quot;&quot;&quot;
-    TIMESPANTEST = fixbools(CalDAVSQLBehaviorMixin.TIMESPANTEST)
-    TIMESPANTEST_NOEND = fixbools(CalDAVSQLBehaviorMixin.TIMESPANTEST_NOEND)
-    TIMESPANTEST_NOSTART = fixbools(CalDAVSQLBehaviorMixin.TIMESPANTEST_NOSTART)
-    TIMESPANTEST_TAIL_PIECE = fixbools(
-        CalDAVSQLBehaviorMixin.TIMESPANTEST_TAIL_PIECE)
-    TIMESPANTEST_JOIN_ON_PIECE = fixbools(
-        CalDAVSQLBehaviorMixin.TIMESPANTEST_JOIN_ON_PIECE)
-
-
-
-class LegacyIndexHelper(object):
-    log = Logger()
-
-    @inlineCallbacks
-    def isAllowedUID(self, uid, *names):
-        &quot;&quot;&quot;
-        Checks to see whether to allow an operation which would add the
-        specified UID to the index.  Specifically, the operation may not
-        violate the constraint that UIDs must be unique.
-        @param uid: the UID to check
-        @param names: the names of resources being replaced or deleted by the
-            operation; UIDs associated with these resources are not checked.
-        @return: True if the UID is not in the index and is not reserved,
-            False otherwise.
-        &quot;&quot;&quot;
-        rname = yield self.resourceNameForUID(uid)
-        returnValue(rname is None or rname in names)
-
-
-    def reserveUID(self, uid):
-        return self.reserver.reserveUID(uid)
-
-
-    def unreserveUID(self, uid):
-        return self.reserver.unreserveUID(uid)
-
-
-    def isReservedUID(self, uid):
-        return self.reserver.isReservedUID(uid)
-
-
-
-class PostgresLegacyIndexEmulator(LegacyIndexHelper):
-    &quot;&quot;&quot;
-    Emulator for L{twistedcaldv.index.Index} and
-    L{twistedcaldv.index.IndexSchedule}.
-    &quot;&quot;&quot;
-
-    def __init__(self, calendar):
-        self.resource = self.calendar = calendar
-        if (
-            hasattr(config, &quot;Memcached&quot;) and
-            config.Memcached.Pools.Default.ClientEnabled
-        ):
-            self.reserver = MemcachedUIDReserver(self)
-        else:
-            # This is only used with unit tests
-            self.reserver = DummyUIDReserver(self)
-
-    _objectSchema = schema.CALENDAR_OBJECT
-
-    @property
-    def _txn(self):
-        return self.calendar._txn
-
-
-    @inlineCallbacks
-    def isAllowedUID(self, uid, *names):
-        &quot;&quot;&quot;
-        Checks to see whether to allow an operation which would add the
-        specified UID to the index.  Specifically, the operation may not
-        violate the constraint that UIDs must be unique.
-        @param uid: the UID to check
-        @param names: the names of resources being replaced or deleted by the
-            operation; UIDs associated with these resources are not checked.
-        @return: True if the UID is not in the index and is not reserved,
-            False otherwise.
-        &quot;&quot;&quot;
-        rname = yield self.resourceNameForUID(uid)
-        returnValue(rname is None or rname in names)
-
-
-    @inlineCallbacks
-    def resourceUIDForName(self, name):
-        uid = yield self.calendar.resourceUIDForName(name)
-        returnValue(uid)
-
-
-    @inlineCallbacks
-    def resourceNameForUID(self, uid):
-        name = yield self.calendar.resourceNameForUID(uid)
-        returnValue(name)
-
-
-    @classproperty
-    def _notExpandedWithinQuery(cls): #@NoSelf
-        &quot;&quot;&quot;
-        DAL query to satisfy L{PostgresLegacyIndexEmulator.notExpandedBeyond}.
-        &quot;&quot;&quot;
-        co = schema.CALENDAR_OBJECT
-        return Select(
-            [co.RESOURCE_NAME],
-            From=co,
-            Where=((co.RECURRANCE_MIN &gt; Parameter(&quot;minDate&quot;))
-                .Or(co.RECURRANCE_MAX &lt; Parameter(&quot;maxDate&quot;)))
-                .And(co.CALENDAR_RESOURCE_ID == Parameter(&quot;resourceID&quot;))
-        )
-
-
-    @inlineCallbacks
-    def notExpandedWithin(self, minDate, maxDate):
-        &quot;&quot;&quot;
-        Gives all resources which have not been expanded beyond a given date
-        in the database.  (Unused; see above L{postgresqlgenerator}.
-        &quot;&quot;&quot;
-        returnValue([row[0] for row in (
-            yield self._notExpandedWithinQuery.on(
-                self._txn,
-                minDate=pyCalendarTodatetime(normalizeForIndex(minDate)) if minDate is not None else None,
-                maxDate=pyCalendarTodatetime(normalizeForIndex(maxDate)),
-                resourceID=self.calendar._resourceID))]
-        )
-
-
-    @inlineCallbacks
-    def reExpandResource(self, name, expand_start, expand_end):
-        &quot;&quot;&quot;
-        Given a resource name, remove it from the database and re-add it
-        with a longer expansion.
-        &quot;&quot;&quot;
-        obj = yield self.calendar.calendarObjectWithName(name)
-
-        # Use a new transaction to do this update quickly without locking the row for too long. However, the original
-        # transaction may have the row locked, so use wait=False and if that fails, fall back to using the original txn.
-
-        newTxn = obj.transaction().store().newTransaction()
-        try:
-            yield obj.lock(wait=False, txn=newTxn)
-        except NoSuchObjectResourceError:
-            yield newTxn.commit()
-            returnValue(None)
-        except:
-            yield newTxn.abort()
-            newTxn = None
-
-        # Now do the re-expand using the appropriate transaction
-        try:
-            doExpand = False
-            if newTxn is None:
-                doExpand = True
-            else:
-                # We repeat this check because the resource may have been re-expanded by someone else
-                rmin, rmax = (yield obj.recurrenceMinMax(txn=newTxn))
-
-                # If the resource is not fully expanded, see if within the required range or not.
-                # Note that expand_start could be None if no lower limit is applied, but expand_end will
-                # never be None
-                if rmax is not None and rmax &lt; expand_end:
-                    doExpand = True
-                if rmin is not None and expand_start is not None and rmin &gt; expand_start:
-                    doExpand = True
-
-            if doExpand:
-                yield obj.updateDatabase(
-                    (yield obj.component()),
-                    expand_until=expand_end,
-                    reCreate=True,
-                    txn=newTxn,
-                )
-        finally:
-            if newTxn is not None:
-                yield newTxn.commit()
-
-
-    @inlineCallbacks
-    def testAndUpdateIndex(self, minDate, maxDate):
-        # Find out if the index is expanded far enough
-        names = yield self.notExpandedWithin(minDate, maxDate)
-
-        # Actually expand recurrence max
-        for name in names:
-            self.log.info(&quot;Search falls outside range of index for %s %s to %s&quot; %
-                          (name, minDate, maxDate))
-            yield self.reExpandResource(name, minDate, maxDate)
-
-
-    @inlineCallbacks
-    def indexedSearch(self, filter, useruid='', fbtype=False):
-        &quot;&quot;&quot;
-        Finds resources matching the given qualifiers.
-
-        @param filter: the L{Filter} for the calendar-query to execute.
-
-        @return: a L{Deferred} which fires with an iterable of tuples for each
-            resource matching the given C{qualifiers}. The tuples are C{(name,
-            uid, type)}, where C{name} is the resource name, C{uid} is the
-            resource UID, and C{type} is the resource iCalendar component type.
-        &quot;&quot;&quot;
-        # Detect which style of parameter-generation we're using.  Naming is a
-        # little off here, because the reason we're using the numeric one is
-        # that it happens to be used by the oracle binding that we're using,
-        # whereas the postgres binding happens to use the 'pyformat' (e.g. %s)
-        # parameter style.
-        if self.calendar._txn.paramstyle == 'numeric':
-            generator = oraclesqlgenerator
-        else:
-            generator = postgresqlgenerator
-        # Make sure we have a proper Filter element and get the partial SQL
-        # statement to use.
-        if isinstance(filter, calendarqueryfilter.Filter):
-            qualifiers = calendarquery.sqlcalendarquery(
-                filter, self.calendar._resourceID, useruid, fbtype,
-                generator=generator
-            )
-            if qualifiers is not None:
-
-                today = DateTime.getToday()
-
-                # Determine how far we need to extend the current expansion of
-                # events. If we have an open-ended time-range we will expand
-                # one year past the start. That should catch bounded
-                # recurrences - unbounded will have been indexed with an
-                # &quot;infinite&quot; value always included.
-                maxDate, isStartDate = filter.getmaxtimerange()
-                if maxDate:
-                    maxDate = maxDate.duplicate()
-                    maxDate.offsetDay(1)
-                    maxDate.setDateOnly(True)
-                    upperLimit = today + Duration(days=config.FreeBusyIndexExpandMaxDays)
-                    if maxDate &gt; upperLimit:
-                        raise TimeRangeUpperLimit(upperLimit)
-                    if isStartDate:
-                        maxDate += Duration(days=365)
-
-                # Determine if the start date is too early for the restricted range we
-                # are applying. If it is today or later we don't need to worry about truncation
-                # in the past.
-                minDate, _ignore_isEndDate = filter.getmintimerange()
-                if minDate &gt;= today:
-                    minDate = None
-                if minDate is not None and config.FreeBusyIndexLowerLimitDays:
-                    truncateLowerLimit = today - Duration(days=config.FreeBusyIndexLowerLimitDays)
-                    if minDate &lt; truncateLowerLimit:
-                        raise TimeRangeLowerLimit(truncateLowerLimit)
-
-                if maxDate is not None or minDate is not None:
-                    yield self.testAndUpdateIndex(minDate, maxDate)
-
-            else:
-                # We cannot handle this filter in an indexed search
-                raise IndexedSearchException()
-        else:
-            qualifiers = None
-
-        # Perform the search
-        if qualifiers is None:
-            rowiter = yield self.bruteForceSearch()
-        else:
-            if fbtype:
-                # For a free-busy time-range query we return all instances
-                rowiter = yield self._txn.execSQL(
-                    &quot;&quot;&quot;
-                    select DISTINCT
-                        CALENDAR_OBJECT.RESOURCE_NAME,
-                        CALENDAR_OBJECT.ICALENDAR_UID,
-                        CALENDAR_OBJECT.ICALENDAR_TYPE,
-                        CALENDAR_OBJECT.ORGANIZER,
-                        TIME_RANGE.FLOATING, TIME_RANGE.START_DATE,
-                        TIME_RANGE.END_DATE, TIME_RANGE.FBTYPE,
-                        TIME_RANGE.TRANSPARENT, TRANSPARENCY.TRANSPARENT
-                    &quot;&quot;&quot; +
-                    qualifiers[0],
-                    qualifiers[1]
-                )
-            else:
-                rowiter = yield self._txn.execSQL(
-                    &quot;&quot;&quot;
-                    select
-                        DISTINCT CALENDAR_OBJECT.RESOURCE_NAME,
-                        CALENDAR_OBJECT.ICALENDAR_UID,
-                        CALENDAR_OBJECT.ICALENDAR_TYPE
-                    &quot;&quot;&quot; +
-                    qualifiers[0],
-                    qualifiers[1]
-                )
-
-        # Check result for missing resources
-
-        results = []
-        for row in rowiter:
-            if fbtype:
-                row = list(row)
-                row[4] = 'Y' if row[4] else 'N'
-                row[7] = indexfbtype_to_icalfbtype[row[7]]
-                if row[9] is not None:
-                    row[8] = row[9]
-                row[8] = 'T' if row[8] else 'F'
-                del row[9]
-            results.append(row)
-        returnValue(results)
-
-
-    @classproperty
-    def _bruteForceQuery(cls): #@NoSelf
-        &quot;&quot;&quot;
-        DAL query for all C{CALENDAR_OBJECT} rows in the calendar represented by
-        this index.
-        &quot;&quot;&quot;
-        obj = cls._objectSchema
-        return Select(
-            [obj.RESOURCE_NAME, obj.ICALENDAR_UID, obj.ICALENDAR_TYPE],
-            From=obj, Where=obj.PARENT_RESOURCE_ID == Parameter(&quot;resourceID&quot;)
-        )
-
-
-    def bruteForceSearch(self):
-        return self._bruteForceQuery.on(
-            self._txn, resourceID=self.resource._resourceID)
-
-
-    @inlineCallbacks
-    def resourcesExist(self, names):
-        returnValue(list(set(names).intersection(
-            set((yield self.calendar.listCalendarObjects())))))
-
-
-    @classproperty
-    def _resourceExistsQuery(cls): #@NoSelf
-        &quot;&quot;&quot;
-        DAL query to determine whether a calendar object exists in the
-        collection represented by this index.
-        &quot;&quot;&quot;
-        obj = cls._objectSchema
-        return Select(
-            [obj.RESOURCE_NAME], From=obj,
-            Where=(obj.RESOURCE_NAME == Parameter(&quot;name&quot;))
-            .And(obj.PARENT_RESOURCE_ID == Parameter(&quot;resourceID&quot;))
-        )
-
-
-    @inlineCallbacks
-    def resourceExists(self, name):
-        returnValue((bool(
-            (yield self._resourceExistsQuery.on(
-                self._txn, name=name, resourceID=self.resource._resourceID))
-        )))
-
-
-
-class PostgresLegacyInboxIndexEmulator(PostgresLegacyIndexEmulator):
-    &quot;&quot;&quot;
-    UIDs need not be unique in the 'inbox' calendar, so override those
-    behaviors intended to ensure that.
-    &quot;&quot;&quot;
-
-    def isAllowedUID(self):
-        return succeed(True)
-
-
-    def reserveUID(self, uid):
-        return succeed(None)
-
-
-    def unreserveUID(self, uid):
-        return succeed(None)
-
-
-    def isReservedUID(self, uid):
-        return succeed(False)
-
-
-
-# CARDDAV
-
-class CardDAVSQLBehaviorMixin(RealSQLBehaviorMixin):
-    &quot;&quot;&quot;
-    Query generator for CardDAV indexed searches.
-    &quot;&quot;&quot;
-
-    FIELDS = {
-        &quot;UID&quot;: &quot;ADDRESSBOOK_OBJECT.VCARD_UID&quot;,
-    }
-    RESOURCEDB = &quot;ADDRESSBOOK_OBJECT&quot;
-
-    def generate(self):
-        &quot;&quot;&quot;
-        Generate the actual SQL 'where ...' expression from the passed in
-        expression tree.
-
-        @return: a C{tuple} of (C{str}, C{list}), where the C{str} is the
-            partial SQL statement, and the C{list} is the list of argument
-            substitutions to use with the SQL API execute method.
-        &quot;&quot;&quot;
-
-        # Init state
-        self.sout = StringIO.StringIO()
-        self.arguments = []
-        self.substitutions = []
-
-        # For SQL data DB we need to restrict the query to just the targeted calendar resource-id if provided
-        if self.calendarid:
-
-            # AND the whole thing
-            test = expression.isExpression(&quot;ADDRESSBOOK_OBJECT.ADDRESSBOOK_HOME_RESOURCE_ID&quot;, str(self.calendarid), True)
-            self.expression = test.andWith(self.expression)
-
-        # Generate ' where ...' partial statement
-        self.sout.write(self.WHERE)
-        self.generateExpression(self.expression)
-
-        # Prefix with ' from ...' partial statement
-        select = self.FROM + self.RESOURCEDB
-        select += self.sout.getvalue()
-
-        select = select % tuple(self.substitutions)
-
-        return select, self.arguments
-
-
-
-class postgresqladbkgenerator(FormatParamStyleMixin, CardDAVSQLBehaviorMixin, sqlgenerator):
-    &quot;&quot;&quot;
-    Query generator for PostgreSQL indexed searches.
-    &quot;&quot;&quot;
-
-
-
-class oraclesqladbkgenerator(CardDAVSQLBehaviorMixin, sqlgenerator):
-    &quot;&quot;&quot;
-    Query generator for Oracle indexed searches.
-    &quot;&quot;&quot;
-
-
-
-class PostgresLegacyABIndexEmulator(LegacyIndexHelper):
-    &quot;&quot;&quot;
-    Emulator for L{twistedcaldv.index.Index} and
-    L{twistedcaldv.index.IndexSchedule}.
-    &quot;&quot;&quot;
-
-    _objectSchema = schema.ADDRESSBOOK_OBJECT
-
-    def __init__(self, addressbook):
-        self.resource = self.addressbook = addressbook
-        if (
-            hasattr(config, &quot;Memcached&quot;) and
-            config.Memcached.Pools.Default.ClientEnabled
-        ):
-            self.reserver = MemcachedUIDReserver(self)
-        else:
-            # This is only used with unit tests
-            self.reserver = DummyUIDReserver(self)
-
-
-    @property
-    def _txn(self):
-        return self.addressbook._txn
-
-
-    @inlineCallbacks
-    def resourceUIDForName(self, name):
-        obj = yield self.addressbook.addressbookObjectWithName(name)
-        if obj is None:
-            returnValue(None)
-        returnValue(obj.uid())
-
-
-    @inlineCallbacks
-    def resourceNameForUID(self, uid):
-        obj = yield self.addressbook.addressbookObjectWithUID(uid)
-        if obj is None:
-            returnValue(None)
-        returnValue(obj.name())
-
-
-    def searchValid(self, filter):
-        if isinstance(filter, addressbookqueryfilter.Filter):
-            qualifiers = addressbookquery.sqladdressbookquery(filter)
-        else:
-            qualifiers = None
-
-        return qualifiers is not None
-
-
-    @inlineCallbacks
-    def search(self, filter):
-        &quot;&quot;&quot;
-        Finds resources matching the given qualifiers.
-        @param filter: the L{Filter} for the addressbook-query to execute.
-        @return: an iterable of tuples for each resource matching the
-            given C{qualifiers}. The tuples are C{(name, uid, type)}, where
-            C{name} is the resource name, C{uid} is the resource UID, and
-            C{type} is the resource iCalendar component type.x
-        &quot;&quot;&quot;
-        if self.addressbook._txn.paramstyle == 'numeric':
-            generator = oraclesqladbkgenerator
-        else:
-            generator = postgresqladbkgenerator
-        # Make sure we have a proper Filter element and get the partial SQL statement to use.
-        if isinstance(filter, addressbookqueryfilter.Filter):
-            qualifiers = addressbookquery.sqladdressbookquery(
-                filter, self.addressbook._resourceID, generator=generator)
-        else:
-            qualifiers = None
-        if qualifiers is not None:
-            rowiter = yield self._txn.execSQL(
-                &quot;select DISTINCT ADDRESSBOOK_OBJECT.RESOURCE_NAME, ADDRESSBOOK_OBJECT.VCARD_UID&quot; +
-                qualifiers[0],
-                qualifiers[1]
-            )
-        else:
-            rowiter = yield Select(
-                [self._objectSchema.RESOURCE_NAME,
-                 self._objectSchema.VCARD_UID],
-                From=self._objectSchema,
-                Where=self._objectSchema.ADDRESSBOOK_HOME_RESOURCE_ID ==
-                self.addressbook._resourceID
-            ).on(self.addressbook._txn)
-
-        returnValue(list(rowiter))
-
-
-    def indexedSearch(self, filter, useruid='', fbtype=False):
-        &quot;&quot;&quot;
-        Always raise L{IndexedSearchException}, since these indexes are not
-        fully implemented yet.
-        &quot;&quot;&quot;
-        raise IndexedSearchException()
-
-
-    @inlineCallbacks
-    def resourcesExist(self, names):
-        returnValue(list(set(names).intersection(
-            set((yield self.addressbook.listAddressBookObjects())))))
</del></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemacurrentoracledialectsql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/current-oracle-dialect.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/current-oracle-dialect.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/current-oracle-dialect.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -18,9 +18,17 @@
</span><span class="cx"> create table CALENDAR_HOME (
</span><span class="cx">     &quot;RESOURCE_ID&quot; integer primary key,
</span><span class="cx">     &quot;OWNER_UID&quot; nvarchar2(255) unique,
</span><ins>+    &quot;STATUS&quot; integer default 0 not null,
</ins><span class="cx">     &quot;DATAVERSION&quot; integer default 0 not null
</span><span class="cx"> );
</span><span class="cx"> 
</span><ins>+create table HOME_STATUS (
+    &quot;ID&quot; integer primary key,
+    &quot;DESCRIPTION&quot; nvarchar2(16) unique
+);
+
+insert into HOME_STATUS (DESCRIPTION, ID) values ('normal', 0);
+insert into HOME_STATUS (DESCRIPTION, ID) values ('external', 1);
</ins><span class="cx"> create table CALENDAR (
</span><span class="cx">     &quot;RESOURCE_ID&quot; integer primary key
</span><span class="cx"> );
</span><span class="lines">@@ -50,6 +58,7 @@
</span><span class="cx"> create table NOTIFICATION_HOME (
</span><span class="cx">     &quot;RESOURCE_ID&quot; integer primary key,
</span><span class="cx">     &quot;OWNER_UID&quot; nvarchar2(255) unique,
</span><ins>+    &quot;STATUS&quot; integer default 0 not null,
</ins><span class="cx">     &quot;DATAVERSION&quot; integer default 0 not null
</span><span class="cx"> );
</span><span class="cx"> 
</span><span class="lines">@@ -68,6 +77,7 @@
</span><span class="cx"> create table CALENDAR_BIND (
</span><span class="cx">     &quot;CALENDAR_HOME_RESOURCE_ID&quot; integer not null references CALENDAR_HOME,
</span><span class="cx">     &quot;CALENDAR_RESOURCE_ID&quot; integer not null references CALENDAR on delete cascade,
</span><ins>+    &quot;EXTERNAL_ID&quot; integer default null,
</ins><span class="cx">     &quot;CALENDAR_RESOURCE_NAME&quot; nvarchar2(255),
</span><span class="cx">     &quot;BIND_MODE&quot; integer not null,
</span><span class="cx">     &quot;BIND_STATUS&quot; integer not null,
</span><span class="lines">@@ -210,6 +220,7 @@
</span><span class="cx">     &quot;RESOURCE_ID&quot; integer primary key,
</span><span class="cx">     &quot;ADDRESSBOOK_PROPERTY_STORE_ID&quot; integer not null,
</span><span class="cx">     &quot;OWNER_UID&quot; nvarchar2(255) unique,
</span><ins>+    &quot;STATUS&quot; integer default 0 not null,
</ins><span class="cx">     &quot;DATAVERSION&quot; integer default 0 not null
</span><span class="cx"> );
</span><span class="cx"> 
</span><span class="lines">@@ -223,6 +234,7 @@
</span><span class="cx"> create table SHARED_ADDRESSBOOK_BIND (
</span><span class="cx">     &quot;ADDRESSBOOK_HOME_RESOURCE_ID&quot; integer not null references ADDRESSBOOK_HOME,
</span><span class="cx">     &quot;OWNER_HOME_RESOURCE_ID&quot; integer not null references ADDRESSBOOK_HOME on delete cascade,
</span><ins>+    &quot;EXTERNAL_ID&quot; integer default null,
</ins><span class="cx">     &quot;ADDRESSBOOK_RESOURCE_NAME&quot; nvarchar2(255),
</span><span class="cx">     &quot;BIND_MODE&quot; integer not null,
</span><span class="cx">     &quot;BIND_STATUS&quot; integer not null,
</span><span class="lines">@@ -275,6 +287,7 @@
</span><span class="cx"> create table SHARED_GROUP_BIND (
</span><span class="cx">     &quot;ADDRESSBOOK_HOME_RESOURCE_ID&quot; integer not null references ADDRESSBOOK_HOME,
</span><span class="cx">     &quot;GROUP_RESOURCE_ID&quot; integer not null references ADDRESSBOOK_OBJECT on delete cascade,
</span><ins>+    &quot;EXTERNAL_ID&quot; integer default null,
</ins><span class="cx">     &quot;GROUP_ADDRESSBOOK_NAME&quot; nvarchar2(255),
</span><span class="cx">     &quot;BIND_MODE&quot; integer not null,
</span><span class="cx">     &quot;BIND_STATUS&quot; integer not null,
</span><span class="lines">@@ -446,6 +459,10 @@
</span><span class="cx">     CALENDAR_HOME_RESOURCE_ID
</span><span class="cx"> );
</span><span class="cx"> 
</span><ins>+create index ATTACHMENT_DROPBOX_ID_5073cf23 on ATTACHMENT (
+    DROPBOX_ID
+);
+
</ins><span class="cx"> create index ATTACHMENT_CALENDAR_O_81508484 on ATTACHMENT_CALENDAR_OBJECT (
</span><span class="cx">     CALENDAR_OBJECT_RESOURCE_ID
</span><span class="cx"> );
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemacurrentsql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/current.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/current.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/current.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -53,10 +53,22 @@
</span><span class="cx"> 
</span><span class="cx"> create table CALENDAR_HOME (
</span><span class="cx">   RESOURCE_ID      integer      primary key default nextval('RESOURCE_ID_SEQ'), -- implicit index
</span><del>-  OWNER_UID        varchar(255) not null unique,                                 -- implicit index
</del><ins>+  OWNER_UID        varchar(255) not null unique,                                -- implicit index
+  STATUS           integer      default 0 not null,                             -- enum HOME_STATUS
</ins><span class="cx">   DATAVERSION      integer      default 0 not null
</span><span class="cx"> );
</span><span class="cx"> 
</span><ins>+-- Enumeration of statuses
+
+create table HOME_STATUS (
+  ID          integer     primary key,
+  DESCRIPTION varchar(16) not null unique
+);
+
+insert into HOME_STATUS values (0, 'normal' );
+insert into HOME_STATUS values (1, 'external');
+
+
</ins><span class="cx"> --------------
</span><span class="cx"> -- Calendar --
</span><span class="cx"> --------------
</span><span class="lines">@@ -65,6 +77,7 @@
</span><span class="cx">   RESOURCE_ID integer   primary key default nextval('RESOURCE_ID_SEQ') -- implicit index
</span><span class="cx"> );
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> ----------------------------
</span><span class="cx"> -- Calendar Home Metadata --
</span><span class="cx"> ----------------------------
</span><span class="lines">@@ -91,6 +104,7 @@
</span><span class="cx"> create index CALENDAR_HOME_METADATA_DEFAULT_POLLS on
</span><span class="cx">         CALENDAR_HOME_METADATA(DEFAULT_POLLS);
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> -----------------------
</span><span class="cx"> -- Calendar Metadata --
</span><span class="cx"> -----------------------
</span><span class="lines">@@ -110,6 +124,7 @@
</span><span class="cx"> create table NOTIFICATION_HOME (
</span><span class="cx">   RESOURCE_ID integer      primary key default nextval('RESOURCE_ID_SEQ'), -- implicit index
</span><span class="cx">   OWNER_UID   varchar(255) not null unique,                                -- implicit index
</span><ins>+  STATUS      integer      default 0 not null,                             -- enum HOME_STATUS
</ins><span class="cx">   DATAVERSION integer      default 0 not null
</span><span class="cx"> );
</span><span class="cx"> 
</span><span class="lines">@@ -139,6 +154,7 @@
</span><span class="cx"> create table CALENDAR_BIND (
</span><span class="cx">   CALENDAR_HOME_RESOURCE_ID integer      not null references CALENDAR_HOME,
</span><span class="cx">   CALENDAR_RESOURCE_ID      integer      not null references CALENDAR on delete cascade,
</span><ins>+  EXTERNAL_ID                            integer      default null,
</ins><span class="cx">   CALENDAR_RESOURCE_NAME    varchar(255) not null,
</span><span class="cx">   BIND_MODE                 integer      not null, -- enum CALENDAR_BIND_MODE
</span><span class="cx">   BIND_STATUS               integer      not null, -- enum CALENDAR_BIND_STATUS
</span><span class="lines">@@ -345,6 +361,9 @@
</span><span class="cx"> create index ATTACHMENT_CALENDAR_HOME_RESOURCE_ID on
</span><span class="cx">   ATTACHMENT(CALENDAR_HOME_RESOURCE_ID);
</span><span class="cx"> 
</span><ins>+create index ATTACHMENT_DROPBOX_ID on
+  ATTACHMENT(DROPBOX_ID);
+
</ins><span class="cx"> -- Many-to-many relationship between attachments and calendar objects
</span><span class="cx"> create table ATTACHMENT_CALENDAR_OBJECT (
</span><span class="cx">   ATTACHMENT_ID                  integer      not null references ATTACHMENT on delete cascade,
</span><span class="lines">@@ -380,6 +399,7 @@
</span><span class="cx">   RESOURCE_ID                                      integer                        primary key default nextval('RESOURCE_ID_SEQ'), -- implicit index
</span><span class="cx">   ADDRESSBOOK_PROPERTY_STORE_ID        integer              default nextval('RESOURCE_ID_SEQ') not null,         -- implicit index
</span><span class="cx">   OWNER_UID                                        varchar(255)         not null unique,                                -- implicit index
</span><ins>+  STATUS                                           integer              default 0 not null,                             -- enum HOME_STATUS
</ins><span class="cx">   DATAVERSION                                      integer              default 0 not null
</span><span class="cx"> );
</span><span class="cx"> 
</span><span class="lines">@@ -405,6 +425,7 @@
</span><span class="cx"> create table SHARED_ADDRESSBOOK_BIND (
</span><span class="cx">   ADDRESSBOOK_HOME_RESOURCE_ID                        integer                        not null references ADDRESSBOOK_HOME,
</span><span class="cx">   OWNER_HOME_RESOURCE_ID                            integer              not null references ADDRESSBOOK_HOME on delete cascade,
</span><ins>+  EXTERNAL_ID                                        integer         default null,
</ins><span class="cx">   ADDRESSBOOK_RESOURCE_NAME                            varchar(255)         not null,
</span><span class="cx">   BIND_MODE                                            integer              not null,        -- enum CALENDAR_BIND_MODE
</span><span class="cx">   BIND_STATUS                                          integer              not null,        -- enum CALENDAR_BIND_STATUS
</span><span class="lines">@@ -504,6 +525,7 @@
</span><span class="cx"> create table SHARED_GROUP_BIND (        
</span><span class="cx">   ADDRESSBOOK_HOME_RESOURCE_ID                 integer      not null references ADDRESSBOOK_HOME,
</span><span class="cx">   GROUP_RESOURCE_ID                              integer      not null references ADDRESSBOOK_OBJECT on delete cascade,
</span><ins>+  EXTERNAL_ID                                    integer      default null,
</ins><span class="cx">   GROUP_ADDRESSBOOK_NAME                        varchar(255) not null,
</span><span class="cx">   BIND_MODE                                    integer      not null, -- enum CALENDAR_BIND_MODE
</span><span class="cx">   BIND_STATUS                                  integer      not null, -- enum CALENDAR_BIND_STATUS
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldoracledialectv27sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v27.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v27.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v27.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -30,7 +30,6 @@
</span><span class="cx">     &quot;QUOTA_USED_BYTES&quot; integer default 0 not null,
</span><span class="cx">     &quot;DEFAULT_EVENTS&quot; integer default null references CALENDAR on delete set null,
</span><span class="cx">     &quot;DEFAULT_TASKS&quot; integer default null references CALENDAR on delete set null,
</span><del>-    &quot;DEFAULT_POLLS&quot; integer default null references CALENDAR on delete set null,
</del><span class="cx">     &quot;ALARM_VEVENT_TIMED&quot; nclob default null,
</span><span class="cx">     &quot;ALARM_VEVENT_ALLDAY&quot; nclob default null,
</span><span class="cx">     &quot;ALARM_VTODO_TIMED&quot; nclob default null,
</span><span class="lines">@@ -377,10 +376,6 @@
</span><span class="cx">     DEFAULT_TASKS
</span><span class="cx"> );
</span><span class="cx"> 
</span><del>-create index CALENDAR_HOME_METADAT_910264ce on CALENDAR_HOME_METADATA (
-    DEFAULT_POLLS
-);
-
</del><span class="cx"> create index NOTIFICATION_NOTIFICA_f891f5f9 on NOTIFICATION (
</span><span class="cx">     NOTIFICATION_HOME_RESOURCE_ID
</span><span class="cx"> );
</span><span class="lines">@@ -423,6 +418,10 @@
</span><span class="cx">     CALENDAR_HOME_RESOURCE_ID
</span><span class="cx"> );
</span><span class="cx"> 
</span><ins>+create index ATTACHMENT_DROPBOX_ID_5073cf23 on ATTACHMENT (
+    DROPBOX_ID
+);
+
</ins><span class="cx"> create index ATTACHMENT_CALENDAR_O_81508484 on ATTACHMENT_CALENDAR_OBJECT (
</span><span class="cx">     CALENDAR_OBJECT_RESOURCE_ID
</span><span class="cx"> );
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldoracledialectv28sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v28.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v28.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v28.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -30,7 +30,6 @@
</span><span class="cx">     &quot;QUOTA_USED_BYTES&quot; integer default 0 not null,
</span><span class="cx">     &quot;DEFAULT_EVENTS&quot; integer default null references CALENDAR on delete set null,
</span><span class="cx">     &quot;DEFAULT_TASKS&quot; integer default null references CALENDAR on delete set null,
</span><del>-    &quot;DEFAULT_POLLS&quot; integer default null references CALENDAR on delete set null,
</del><span class="cx">     &quot;ALARM_VEVENT_TIMED&quot; nclob default null,
</span><span class="cx">     &quot;ALARM_VEVENT_ALLDAY&quot; nclob default null,
</span><span class="cx">     &quot;ALARM_VTODO_TIMED&quot; nclob default null,
</span><span class="lines">@@ -378,10 +377,6 @@
</span><span class="cx">     DEFAULT_TASKS
</span><span class="cx"> );
</span><span class="cx"> 
</span><del>-create index CALENDAR_HOME_METADAT_910264ce on CALENDAR_HOME_METADATA (
-    DEFAULT_POLLS
-);
-
</del><span class="cx"> create index NOTIFICATION_NOTIFICA_f891f5f9 on NOTIFICATION (
</span><span class="cx">     NOTIFICATION_HOME_RESOURCE_ID
</span><span class="cx"> );
</span><span class="lines">@@ -424,6 +419,10 @@
</span><span class="cx">     CALENDAR_HOME_RESOURCE_ID
</span><span class="cx"> );
</span><span class="cx"> 
</span><ins>+create index ATTACHMENT_DROPBOX_ID_5073cf23 on ATTACHMENT (
+    DROPBOX_ID
+);
+
</ins><span class="cx"> create index ATTACHMENT_CALENDAR_O_81508484 on ATTACHMENT_CALENDAR_OBJECT (
</span><span class="cx">     CALENDAR_OBJECT_RESOURCE_ID
</span><span class="cx"> );
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldoracledialectv29sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v29.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v29.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v29.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -49,16 +49,15 @@
</span><span class="cx"> 
</span><span class="cx"> create table NOTIFICATION_HOME (
</span><span class="cx">     &quot;RESOURCE_ID&quot; integer primary key,
</span><del>-    &quot;OWNER_UID&quot; nvarchar2(255) unique,
-    &quot;DATAVERSION&quot; integer default 0 not null
</del><ins>+    &quot;OWNER_UID&quot; nvarchar2(255) unique
</ins><span class="cx"> );
</span><span class="cx"> 
</span><span class="cx"> create table NOTIFICATION (
</span><span class="cx">     &quot;RESOURCE_ID&quot; integer primary key,
</span><span class="cx">     &quot;NOTIFICATION_HOME_RESOURCE_ID&quot; integer not null references NOTIFICATION_HOME,
</span><span class="cx">     &quot;NOTIFICATION_UID&quot; nvarchar2(255),
</span><del>-    &quot;NOTIFICATION_TYPE&quot; nvarchar2(255),
-    &quot;NOTIFICATION_DATA&quot; nclob,
</del><ins>+    &quot;XML_TYPE&quot; nvarchar2(255),
+    &quot;XML_DATA&quot; nclob,
</ins><span class="cx">     &quot;MD5&quot; nchar(32),
</span><span class="cx">     &quot;CREATED&quot; timestamp default CURRENT_TIMESTAMP at time zone 'UTC',
</span><span class="cx">     &quot;MODIFIED&quot; timestamp default CURRENT_TIMESTAMP at time zone 'UTC', 
</span><span class="lines">@@ -92,7 +91,6 @@
</span><span class="cx"> insert into CALENDAR_BIND_MODE (DESCRIPTION, ID) values ('read', 1);
</span><span class="cx"> insert into CALENDAR_BIND_MODE (DESCRIPTION, ID) values ('write', 2);
</span><span class="cx"> insert into CALENDAR_BIND_MODE (DESCRIPTION, ID) values ('direct', 3);
</span><del>-insert into CALENDAR_BIND_MODE (DESCRIPTION, ID) values ('indirect', 4);
</del><span class="cx"> create table CALENDAR_BIND_STATUS (
</span><span class="cx">     &quot;ID&quot; integer primary key,
</span><span class="cx">     &quot;DESCRIPTION&quot; nvarchar2(16) unique
</span><span class="lines">@@ -102,7 +100,6 @@
</span><span class="cx"> insert into CALENDAR_BIND_STATUS (DESCRIPTION, ID) values ('accepted', 1);
</span><span class="cx"> insert into CALENDAR_BIND_STATUS (DESCRIPTION, ID) values ('declined', 2);
</span><span class="cx"> insert into CALENDAR_BIND_STATUS (DESCRIPTION, ID) values ('invalid', 3);
</span><del>-insert into CALENDAR_BIND_STATUS (DESCRIPTION, ID) values ('deleted', 4);
</del><span class="cx"> create table CALENDAR_TRANSP (
</span><span class="cx">     &quot;ID&quot; integer primary key,
</span><span class="cx">     &quot;DESCRIPTION&quot; nvarchar2(16) unique
</span><span class="lines">@@ -373,7 +370,6 @@
</span><span class="cx"> insert into CALENDARSERVER (NAME, VALUE) values ('VERSION', '29');
</span><span class="cx"> insert into CALENDARSERVER (NAME, VALUE) values ('CALENDAR-DATAVERSION', '5');
</span><span class="cx"> insert into CALENDARSERVER (NAME, VALUE) values ('ADDRESSBOOK-DATAVERSION', '2');
</span><del>-insert into CALENDARSERVER (NAME, VALUE) values ('NOTIFICATION-DATAVERSION', '1');
</del><span class="cx"> create index CALENDAR_HOME_METADAT_3cb9049e on CALENDAR_HOME_METADATA (
</span><span class="cx">     DEFAULT_EVENTS
</span><span class="cx"> );
</span><span class="lines">@@ -428,6 +424,10 @@
</span><span class="cx">     CALENDAR_HOME_RESOURCE_ID
</span><span class="cx"> );
</span><span class="cx"> 
</span><ins>+create index ATTACHMENT_DROPBOX_ID_5073cf23 on ATTACHMENT (
+    DROPBOX_ID
+);
+
</ins><span class="cx"> create index ATTACHMENT_CALENDAR_O_81508484 on ATTACHMENT_CALENDAR_OBJECT (
</span><span class="cx">     CALENDAR_OBJECT_RESOURCE_ID
</span><span class="cx"> );
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldoracledialectv30sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v30.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v30.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v30.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -256,12 +256,10 @@
</span><span class="cx"> insert into ADDRESSBOOK_OBJECT_KIND (DESCRIPTION, ID) values ('resource', 2);
</span><span class="cx"> insert into ADDRESSBOOK_OBJECT_KIND (DESCRIPTION, ID) values ('location', 3);
</span><span class="cx"> create table ABO_MEMBERS (
</span><del>-    &quot;GROUP_ID&quot; integer not null,
</del><ins>+    &quot;GROUP_ID&quot; integer not null references ADDRESSBOOK_OBJECT on delete cascade,
</ins><span class="cx">     &quot;ADDRESSBOOK_ID&quot; integer not null references ADDRESSBOOK_HOME on delete cascade,
</span><del>-    &quot;MEMBER_ID&quot; integer not null,
-    &quot;REVISION&quot; integer not null,
-    &quot;REMOVED&quot; integer default 0 not null, 
-    primary key(&quot;GROUP_ID&quot;, &quot;MEMBER_ID&quot;, &quot;REVISION&quot;)
</del><ins>+    &quot;MEMBER_ID&quot; integer not null references ADDRESSBOOK_OBJECT, 
+    primary key(&quot;GROUP_ID&quot;, &quot;MEMBER_ID&quot;)
</ins><span class="cx"> );
</span><span class="cx"> 
</span><span class="cx"> create table ABO_FOREIGN_MEMBERS (
</span><span class="lines">@@ -296,7 +294,6 @@
</span><span class="cx">     &quot;ADDRESSBOOK_HOME_RESOURCE_ID&quot; integer not null references ADDRESSBOOK_HOME,
</span><span class="cx">     &quot;OWNER_HOME_RESOURCE_ID&quot; integer references ADDRESSBOOK_HOME,
</span><span class="cx">     &quot;ADDRESSBOOK_NAME&quot; nvarchar2(255) default null,
</span><del>-    &quot;OBJECT_RESOURCE_ID&quot; integer default 0,
</del><span class="cx">     &quot;RESOURCE_NAME&quot; nvarchar2(255),
</span><span class="cx">     &quot;REVISION&quot; integer not null,
</span><span class="cx">     &quot;DELETED&quot; integer not null
</span><span class="lines">@@ -431,6 +428,10 @@
</span><span class="cx">     CALENDAR_HOME_RESOURCE_ID
</span><span class="cx"> );
</span><span class="cx"> 
</span><ins>+create index ATTACHMENT_DROPBOX_ID_5073cf23 on ATTACHMENT (
+    DROPBOX_ID
+);
+
</ins><span class="cx"> create index ATTACHMENT_CALENDAR_O_81508484 on ATTACHMENT_CALENDAR_OBJECT (
</span><span class="cx">     CALENDAR_OBJECT_RESOURCE_ID
</span><span class="cx"> );
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldoracledialectv31sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v31.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v31.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v31.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -431,6 +431,10 @@
</span><span class="cx">     CALENDAR_HOME_RESOURCE_ID
</span><span class="cx"> );
</span><span class="cx"> 
</span><ins>+create index ATTACHMENT_DROPBOX_ID_5073cf23 on ATTACHMENT (
+    DROPBOX_ID
+);
+
</ins><span class="cx"> create index ATTACHMENT_CALENDAR_O_81508484 on ATTACHMENT_CALENDAR_OBJECT (
</span><span class="cx">     CALENDAR_OBJECT_RESOURCE_ID
</span><span class="cx"> );
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldoracledialectv32sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v32.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v32.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/oracle-dialect/v32.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -18,9 +18,17 @@
</span><span class="cx"> create table CALENDAR_HOME (
</span><span class="cx">     &quot;RESOURCE_ID&quot; integer primary key,
</span><span class="cx">     &quot;OWNER_UID&quot; nvarchar2(255) unique,
</span><ins>+    &quot;STATUS&quot; integer default 0 not null,
</ins><span class="cx">     &quot;DATAVERSION&quot; integer default 0 not null
</span><span class="cx"> );
</span><span class="cx"> 
</span><ins>+create table HOME_STATUS (
+    &quot;ID&quot; integer primary key,
+    &quot;DESCRIPTION&quot; nvarchar2(16) unique
+);
+
+insert into HOME_STATUS (DESCRIPTION, ID) values ('normal', 0);
+insert into HOME_STATUS (DESCRIPTION, ID) values ('external', 1);
</ins><span class="cx"> create table CALENDAR (
</span><span class="cx">     &quot;RESOURCE_ID&quot; integer primary key
</span><span class="cx"> );
</span><span class="lines">@@ -50,6 +58,7 @@
</span><span class="cx"> create table NOTIFICATION_HOME (
</span><span class="cx">     &quot;RESOURCE_ID&quot; integer primary key,
</span><span class="cx">     &quot;OWNER_UID&quot; nvarchar2(255) unique,
</span><ins>+    &quot;STATUS&quot; integer default 0 not null,
</ins><span class="cx">     &quot;DATAVERSION&quot; integer default 0 not null
</span><span class="cx"> );
</span><span class="cx"> 
</span><span class="lines">@@ -68,6 +77,7 @@
</span><span class="cx"> create table CALENDAR_BIND (
</span><span class="cx">     &quot;CALENDAR_HOME_RESOURCE_ID&quot; integer not null references CALENDAR_HOME,
</span><span class="cx">     &quot;CALENDAR_RESOURCE_ID&quot; integer not null references CALENDAR on delete cascade,
</span><ins>+    &quot;EXTERNAL_ID&quot; integer default null,
</ins><span class="cx">     &quot;CALENDAR_RESOURCE_NAME&quot; nvarchar2(255),
</span><span class="cx">     &quot;BIND_MODE&quot; integer not null,
</span><span class="cx">     &quot;BIND_STATUS&quot; integer not null,
</span><span class="lines">@@ -210,6 +220,7 @@
</span><span class="cx">     &quot;RESOURCE_ID&quot; integer primary key,
</span><span class="cx">     &quot;ADDRESSBOOK_PROPERTY_STORE_ID&quot; integer not null,
</span><span class="cx">     &quot;OWNER_UID&quot; nvarchar2(255) unique,
</span><ins>+    &quot;STATUS&quot; integer default 0 not null,
</ins><span class="cx">     &quot;DATAVERSION&quot; integer default 0 not null
</span><span class="cx"> );
</span><span class="cx"> 
</span><span class="lines">@@ -223,6 +234,7 @@
</span><span class="cx"> create table SHARED_ADDRESSBOOK_BIND (
</span><span class="cx">     &quot;ADDRESSBOOK_HOME_RESOURCE_ID&quot; integer not null references ADDRESSBOOK_HOME,
</span><span class="cx">     &quot;OWNER_HOME_RESOURCE_ID&quot; integer not null references ADDRESSBOOK_HOME on delete cascade,
</span><ins>+    &quot;EXTERNAL_ID&quot; integer default null,
</ins><span class="cx">     &quot;ADDRESSBOOK_RESOURCE_NAME&quot; nvarchar2(255),
</span><span class="cx">     &quot;BIND_MODE&quot; integer not null,
</span><span class="cx">     &quot;BIND_STATUS&quot; integer not null,
</span><span class="lines">@@ -274,6 +286,7 @@
</span><span class="cx"> create table SHARED_GROUP_BIND (
</span><span class="cx">     &quot;ADDRESSBOOK_HOME_RESOURCE_ID&quot; integer not null references ADDRESSBOOK_HOME,
</span><span class="cx">     &quot;GROUP_RESOURCE_ID&quot; integer not null references ADDRESSBOOK_OBJECT on delete cascade,
</span><ins>+    &quot;EXTERNAL_ID&quot; integer default null,
</ins><span class="cx">     &quot;GROUP_ADDRESSBOOK_NAME&quot; nvarchar2(255),
</span><span class="cx">     &quot;BIND_MODE&quot; integer not null,
</span><span class="cx">     &quot;BIND_STATUS&quot; integer not null,
</span><span class="lines">@@ -431,6 +444,10 @@
</span><span class="cx">     CALENDAR_HOME_RESOURCE_ID
</span><span class="cx"> );
</span><span class="cx"> 
</span><ins>+create index ATTACHMENT_DROPBOX_ID_5073cf23 on ATTACHMENT (
+    DROPBOX_ID
+);
+
</ins><span class="cx"> create index ATTACHMENT_CALENDAR_O_81508484 on ATTACHMENT_CALENDAR_OBJECT (
</span><span class="cx">     CALENDAR_OBJECT_RESOURCE_ID
</span><span class="cx"> );
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv10sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v10.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v10.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v10.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv11sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v11.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v11.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v11.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv12sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v12.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v12.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v12.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv13sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v13.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v13.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v13.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv14sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v14.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v14.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v14.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv15sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v15.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v15.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v15.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv16sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v16.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v16.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v16.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv17sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v17.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v17.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v17.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv18sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v18.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v18.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v18.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv19sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v19.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v19.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v19.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv20sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v20.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v20.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v20.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv21sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v21.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v21.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v21.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv22sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v22.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v22.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v22.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv23sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v23.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v23.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v23.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv24sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v24.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v24.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v24.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv25sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v25.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v25.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v25.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv26sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v26.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v26.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v26.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv27sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v27.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v27.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v27.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span><span class="lines">@@ -74,7 +74,6 @@
</span><span class="cx">   QUOTA_USED_BYTES         integer     default 0 not null,
</span><span class="cx">   DEFAULT_EVENTS           integer     default null references CALENDAR on delete set null,
</span><span class="cx">   DEFAULT_TASKS            integer     default null references CALENDAR on delete set null,
</span><del>-  DEFAULT_POLLS            integer     default null references CALENDAR on delete set null,
</del><span class="cx">   ALARM_VEVENT_TIMED       text        default null,
</span><span class="cx">   ALARM_VEVENT_ALLDAY      text        default null,
</span><span class="cx">   ALARM_VTODO_TIMED        text        default null,
</span><span class="lines">@@ -88,8 +87,6 @@
</span><span class="cx">         CALENDAR_HOME_METADATA(DEFAULT_EVENTS);
</span><span class="cx"> create index CALENDAR_HOME_METADATA_DEFAULT_TASKS on
</span><span class="cx">         CALENDAR_HOME_METADATA(DEFAULT_TASKS);
</span><del>-create index CALENDAR_HOME_METADATA_DEFAULT_POLLS on
-        CALENDAR_HOME_METADATA(DEFAULT_POLLS);
</del><span class="cx"> 
</span><span class="cx"> -----------------------
</span><span class="cx"> -- Calendar Metadata --
</span><span class="lines">@@ -342,6 +339,9 @@
</span><span class="cx"> create index ATTACHMENT_CALENDAR_HOME_RESOURCE_ID on
</span><span class="cx">   ATTACHMENT(CALENDAR_HOME_RESOURCE_ID);
</span><span class="cx"> 
</span><ins>+create index ATTACHMENT_DROPBOX_ID on
+  ATTACHMENT(DROPBOX_ID);
+
</ins><span class="cx"> -- Many-to-many relationship between attachments and calendar objects
</span><span class="cx"> create table ATTACHMENT_CALENDAR_OBJECT (
</span><span class="cx">   ATTACHMENT_ID                  integer      not null references ATTACHMENT on delete cascade,
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv28sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v28.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v28.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v28.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span><span class="lines">@@ -74,7 +74,6 @@
</span><span class="cx">   QUOTA_USED_BYTES         integer     default 0 not null,
</span><span class="cx">   DEFAULT_EVENTS           integer     default null references CALENDAR on delete set null,
</span><span class="cx">   DEFAULT_TASKS            integer     default null references CALENDAR on delete set null,
</span><del>-  DEFAULT_POLLS            integer     default null references CALENDAR on delete set null,
</del><span class="cx">   ALARM_VEVENT_TIMED       text        default null,
</span><span class="cx">   ALARM_VEVENT_ALLDAY      text        default null,
</span><span class="cx">   ALARM_VTODO_TIMED        text        default null,
</span><span class="lines">@@ -88,8 +87,6 @@
</span><span class="cx">         CALENDAR_HOME_METADATA(DEFAULT_EVENTS);
</span><span class="cx"> create index CALENDAR_HOME_METADATA_DEFAULT_TASKS on
</span><span class="cx">         CALENDAR_HOME_METADATA(DEFAULT_TASKS);
</span><del>-create index CALENDAR_HOME_METADATA_DEFAULT_POLLS on
-        CALENDAR_HOME_METADATA(DEFAULT_POLLS);
</del><span class="cx"> 
</span><span class="cx"> -----------------------
</span><span class="cx"> -- Calendar Metadata --
</span><span class="lines">@@ -342,6 +339,9 @@
</span><span class="cx"> create index ATTACHMENT_CALENDAR_HOME_RESOURCE_ID on
</span><span class="cx">   ATTACHMENT(CALENDAR_HOME_RESOURCE_ID);
</span><span class="cx"> 
</span><ins>+create index ATTACHMENT_DROPBOX_ID on
+  ATTACHMENT(DROPBOX_ID);
+
</ins><span class="cx"> -- Many-to-many relationship between attachments and calendar objects
</span><span class="cx"> create table ATTACHMENT_CALENDAR_OBJECT (
</span><span class="cx">   ATTACHMENT_ID                  integer      not null references ATTACHMENT on delete cascade,
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv29sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v29.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v29.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v29.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span><span class="lines">@@ -109,16 +109,15 @@
</span><span class="cx"> 
</span><span class="cx"> create table NOTIFICATION_HOME (
</span><span class="cx">   RESOURCE_ID integer      primary key default nextval('RESOURCE_ID_SEQ'), -- implicit index
</span><del>-  OWNER_UID   varchar(255) not null unique,                                -- implicit index
-  DATAVERSION integer      default 0 not null
</del><ins>+  OWNER_UID   varchar(255) not null unique                                 -- implicit index
</ins><span class="cx"> );
</span><span class="cx"> 
</span><span class="cx"> create table NOTIFICATION (
</span><span class="cx">   RESOURCE_ID                   integer      primary key default nextval('RESOURCE_ID_SEQ'), -- implicit index
</span><span class="cx">   NOTIFICATION_HOME_RESOURCE_ID integer      not null references NOTIFICATION_HOME,
</span><span class="cx">   NOTIFICATION_UID              varchar(255) not null,
</span><del>-  NOTIFICATION_TYPE             varchar(255) not null,
-  NOTIFICATION_DATA             text         not null,
</del><ins>+  XML_TYPE                      varchar(255) not null,
+  XML_DATA                      text         not null,
</ins><span class="cx">   MD5                           char(32)     not null,
</span><span class="cx">   CREATED                       timestamp    default timezone('UTC', CURRENT_TIMESTAMP),
</span><span class="cx">   MODIFIED                      timestamp    default timezone('UTC', CURRENT_TIMESTAMP),
</span><span class="lines">@@ -169,7 +168,6 @@
</span><span class="cx"> insert into CALENDAR_BIND_MODE values (1, 'read' );
</span><span class="cx"> insert into CALENDAR_BIND_MODE values (2, 'write');
</span><span class="cx"> insert into CALENDAR_BIND_MODE values (3, 'direct');
</span><del>-insert into CALENDAR_BIND_MODE values (4, 'indirect');
</del><span class="cx"> 
</span><span class="cx"> -- Enumeration of statuses
</span><span class="cx"> 
</span><span class="lines">@@ -182,7 +180,6 @@
</span><span class="cx"> insert into CALENDAR_BIND_STATUS values (1, 'accepted');
</span><span class="cx"> insert into CALENDAR_BIND_STATUS values (2, 'declined');
</span><span class="cx"> insert into CALENDAR_BIND_STATUS values (3, 'invalid');
</span><del>-insert into CALENDAR_BIND_STATUS values (4, 'deleted');
</del><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> -- Enumeration of transparency
</span><span class="lines">@@ -345,6 +342,9 @@
</span><span class="cx"> create index ATTACHMENT_CALENDAR_HOME_RESOURCE_ID on
</span><span class="cx">   ATTACHMENT(CALENDAR_HOME_RESOURCE_ID);
</span><span class="cx"> 
</span><ins>+create index ATTACHMENT_DROPBOX_ID on
+  ATTACHMENT(DROPBOX_ID);
+
</ins><span class="cx"> -- Many-to-many relationship between attachments and calendar objects
</span><span class="cx"> create table ATTACHMENT_CALENDAR_OBJECT (
</span><span class="cx">   ATTACHMENT_ID                  integer      not null references ATTACHMENT on delete cascade,
</span><span class="lines">@@ -705,4 +705,3 @@
</span><span class="cx"> insert into CALENDARSERVER values ('VERSION', '29');
</span><span class="cx"> insert into CALENDARSERVER values ('CALENDAR-DATAVERSION', '5');
</span><span class="cx"> insert into CALENDARSERVER values ('ADDRESSBOOK-DATAVERSION', '2');
</span><del>-insert into CALENDARSERVER values ('NOTIFICATION-DATAVERSION', '1');
</del></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv3sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v3.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v3.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v3.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv30sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v30.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v30.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v30.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span><span class="lines">@@ -345,6 +345,9 @@
</span><span class="cx"> create index ATTACHMENT_CALENDAR_HOME_RESOURCE_ID on
</span><span class="cx">   ATTACHMENT(CALENDAR_HOME_RESOURCE_ID);
</span><span class="cx"> 
</span><ins>+create index ATTACHMENT_DROPBOX_ID on
+  ATTACHMENT(DROPBOX_ID);
+
</ins><span class="cx"> -- Many-to-many relationship between attachments and calendar objects
</span><span class="cx"> create table ATTACHMENT_CALENDAR_OBJECT (
</span><span class="cx">   ATTACHMENT_ID                  integer      not null references ATTACHMENT on delete cascade,
</span><span class="lines">@@ -454,24 +457,16 @@
</span><span class="cx"> insert into ADDRESSBOOK_OBJECT_KIND values (3, 'location');
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-----------------------------------
--- Revisions, forward reference --
-----------------------------------
-
-create sequence REVISION_SEQ;
-
</del><span class="cx"> ---------------------------------
</span><span class="cx"> -- Address Book Object Members --
</span><span class="cx"> ---------------------------------
</span><span class="cx"> 
</span><span class="cx"> create table ABO_MEMBERS (
</span><del>-    GROUP_ID              integer      not null, -- references ADDRESSBOOK_OBJECT on delete cascade,        -- AddressBook Object's (kind=='group') RESOURCE_ID
</del><ins>+    GROUP_ID              integer      not null references ADDRESSBOOK_OBJECT on delete cascade,        -- AddressBook Object's (kind=='group') RESOURCE_ID
</ins><span class="cx">          ADDRESSBOOK_ID                  integer      not null references ADDRESSBOOK_HOME on delete cascade,
</span><del>-    MEMBER_ID             integer      not null, -- references ADDRESSBOOK_OBJECT,                                                -- member AddressBook Object's RESOURCE_ID
-          REVISION              integer      default nextval('REVISION_SEQ') not null,
-          REMOVED               boolean      default false not null,
</del><ins>+    MEMBER_ID             integer      not null references ADDRESSBOOK_OBJECT,                                                -- member AddressBook Object's RESOURCE_ID
</ins><span class="cx"> 
</span><del>-    primary key (GROUP_ID, MEMBER_ID, REVISION) -- implicit index
</del><ins>+    primary key (GROUP_ID, MEMBER_ID) -- implicit index
</ins><span class="cx"> );
</span><span class="cx"> 
</span><span class="cx"> create index ABO_MEMBERS_ADDRESSBOOK_ID on
</span><span class="lines">@@ -510,7 +505,7 @@
</span><span class="cx">   MESSAGE                                      text,                  -- FIXME: xml?
</span><span class="cx"> 
</span><span class="cx">   primary key (ADDRESSBOOK_HOME_RESOURCE_ID, GROUP_RESOURCE_ID), -- implicit index
</span><del>-  unique (ADDRESSBOOK_HOME_RESOURCE_ID, GROUP_ADDRESSBOOK_NAME)  -- implicit index
</del><ins>+  unique (ADDRESSBOOK_HOME_RESOURCE_ID, GROUP_ADDRESSBOOK_NAME)     -- implicit index
</ins><span class="cx"> );
</span><span class="cx"> 
</span><span class="cx"> create index SHARED_GROUP_BIND_RESOURCE_ID on
</span><span class="lines">@@ -521,7 +516,7 @@
</span><span class="cx"> -- Revisions --
</span><span class="cx"> ---------------
</span><span class="cx"> 
</span><del>--- create sequence REVISION_SEQ;
</del><ins>+create sequence REVISION_SEQ;
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> -------------------------------
</span><span class="lines">@@ -555,7 +550,6 @@
</span><span class="cx">   ADDRESSBOOK_HOME_RESOURCE_ID                         integer                        not null references ADDRESSBOOK_HOME,
</span><span class="cx">   OWNER_HOME_RESOURCE_ID                            integer             references ADDRESSBOOK_HOME,
</span><span class="cx">   ADDRESSBOOK_NAME                                     varchar(255)         default null,
</span><del>-  OBJECT_RESOURCE_ID                                        integer                        default 0,
</del><span class="cx">   RESOURCE_NAME                                        varchar(255),
</span><span class="cx">   REVISION                                             integer             default nextval('REVISION_SEQ') not null,
</span><span class="cx">   DELETED                                              boolean              not null
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv31sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v31.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v31.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v31.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span><span class="lines">@@ -345,6 +345,9 @@
</span><span class="cx"> create index ATTACHMENT_CALENDAR_HOME_RESOURCE_ID on
</span><span class="cx">   ATTACHMENT(CALENDAR_HOME_RESOURCE_ID);
</span><span class="cx"> 
</span><ins>+create index ATTACHMENT_DROPBOX_ID on
+  ATTACHMENT(DROPBOX_ID);
+
</ins><span class="cx"> -- Many-to-many relationship between attachments and calendar objects
</span><span class="cx"> create table ATTACHMENT_CALENDAR_OBJECT (
</span><span class="cx">   ATTACHMENT_ID                  integer      not null references ATTACHMENT on delete cascade,
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv32sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v32.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v32.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v32.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span><span class="lines">@@ -53,10 +53,22 @@
</span><span class="cx"> 
</span><span class="cx"> create table CALENDAR_HOME (
</span><span class="cx">   RESOURCE_ID      integer      primary key default nextval('RESOURCE_ID_SEQ'), -- implicit index
</span><del>-  OWNER_UID        varchar(255) not null unique,                                 -- implicit index
</del><ins>+  OWNER_UID        varchar(255) not null unique,                                -- implicit index
+  STATUS           integer      default 0 not null,                             -- enum HOME_STATUS
</ins><span class="cx">   DATAVERSION      integer      default 0 not null
</span><span class="cx"> );
</span><span class="cx"> 
</span><ins>+-- Enumeration of statuses
+
+create table HOME_STATUS (
+  ID          integer     primary key,
+  DESCRIPTION varchar(16) not null unique
+);
+
+insert into HOME_STATUS values (0, 'normal' );
+insert into HOME_STATUS values (1, 'external');
+
+
</ins><span class="cx"> --------------
</span><span class="cx"> -- Calendar --
</span><span class="cx"> --------------
</span><span class="lines">@@ -65,6 +77,7 @@
</span><span class="cx">   RESOURCE_ID integer   primary key default nextval('RESOURCE_ID_SEQ') -- implicit index
</span><span class="cx"> );
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> ----------------------------
</span><span class="cx"> -- Calendar Home Metadata --
</span><span class="cx"> ----------------------------
</span><span class="lines">@@ -91,6 +104,7 @@
</span><span class="cx"> create index CALENDAR_HOME_METADATA_DEFAULT_POLLS on
</span><span class="cx">         CALENDAR_HOME_METADATA(DEFAULT_POLLS);
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> -----------------------
</span><span class="cx"> -- Calendar Metadata --
</span><span class="cx"> -----------------------
</span><span class="lines">@@ -110,6 +124,7 @@
</span><span class="cx"> create table NOTIFICATION_HOME (
</span><span class="cx">   RESOURCE_ID integer      primary key default nextval('RESOURCE_ID_SEQ'), -- implicit index
</span><span class="cx">   OWNER_UID   varchar(255) not null unique,                                -- implicit index
</span><ins>+  STATUS      integer      default 0 not null,                             -- enum HOME_STATUS
</ins><span class="cx">   DATAVERSION integer      default 0 not null
</span><span class="cx"> );
</span><span class="cx"> 
</span><span class="lines">@@ -139,6 +154,7 @@
</span><span class="cx"> create table CALENDAR_BIND (
</span><span class="cx">   CALENDAR_HOME_RESOURCE_ID integer      not null references CALENDAR_HOME,
</span><span class="cx">   CALENDAR_RESOURCE_ID      integer      not null references CALENDAR on delete cascade,
</span><ins>+  EXTERNAL_ID                            integer      default null,
</ins><span class="cx">   CALENDAR_RESOURCE_NAME    varchar(255) not null,
</span><span class="cx">   BIND_MODE                 integer      not null, -- enum CALENDAR_BIND_MODE
</span><span class="cx">   BIND_STATUS               integer      not null, -- enum CALENDAR_BIND_STATUS
</span><span class="lines">@@ -345,6 +361,9 @@
</span><span class="cx"> create index ATTACHMENT_CALENDAR_HOME_RESOURCE_ID on
</span><span class="cx">   ATTACHMENT(CALENDAR_HOME_RESOURCE_ID);
</span><span class="cx"> 
</span><ins>+create index ATTACHMENT_DROPBOX_ID on
+  ATTACHMENT(DROPBOX_ID);
+
</ins><span class="cx"> -- Many-to-many relationship between attachments and calendar objects
</span><span class="cx"> create table ATTACHMENT_CALENDAR_OBJECT (
</span><span class="cx">   ATTACHMENT_ID                  integer      not null references ATTACHMENT on delete cascade,
</span><span class="lines">@@ -380,6 +399,7 @@
</span><span class="cx">   RESOURCE_ID                                      integer                        primary key default nextval('RESOURCE_ID_SEQ'), -- implicit index
</span><span class="cx">   ADDRESSBOOK_PROPERTY_STORE_ID        integer              default nextval('RESOURCE_ID_SEQ') not null,         -- implicit index
</span><span class="cx">   OWNER_UID                                        varchar(255)         not null unique,                                -- implicit index
</span><ins>+  STATUS                                           integer              default 0 not null,                             -- enum HOME_STATUS
</ins><span class="cx">   DATAVERSION                                      integer              default 0 not null
</span><span class="cx"> );
</span><span class="cx"> 
</span><span class="lines">@@ -405,6 +425,7 @@
</span><span class="cx"> create table SHARED_ADDRESSBOOK_BIND (
</span><span class="cx">   ADDRESSBOOK_HOME_RESOURCE_ID                        integer                        not null references ADDRESSBOOK_HOME,
</span><span class="cx">   OWNER_HOME_RESOURCE_ID                            integer              not null references ADDRESSBOOK_HOME on delete cascade,
</span><ins>+  EXTERNAL_ID                                        integer         default null,
</ins><span class="cx">   ADDRESSBOOK_RESOURCE_NAME                            varchar(255)         not null,
</span><span class="cx">   BIND_MODE                                            integer              not null,        -- enum CALENDAR_BIND_MODE
</span><span class="cx">   BIND_STATUS                                          integer              not null,        -- enum CALENDAR_BIND_STATUS
</span><span class="lines">@@ -503,6 +524,7 @@
</span><span class="cx"> create table SHARED_GROUP_BIND (        
</span><span class="cx">   ADDRESSBOOK_HOME_RESOURCE_ID                 integer      not null references ADDRESSBOOK_HOME,
</span><span class="cx">   GROUP_RESOURCE_ID                              integer      not null references ADDRESSBOOK_OBJECT on delete cascade,
</span><ins>+  EXTERNAL_ID                                    integer      default null,
</ins><span class="cx">   GROUP_ADDRESSBOOK_NAME                        varchar(255) not null,
</span><span class="cx">   BIND_MODE                                    integer      not null, -- enum CALENDAR_BIND_MODE
</span><span class="cx">   BIND_STATUS                                  integer      not null, -- enum CALENDAR_BIND_STATUS
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv4sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v4.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v4.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v4.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv5sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v5.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v5.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v5.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv6sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v6.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v6.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v6.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv7sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v7.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v7.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v7.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv8sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v8.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v8.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v8.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaoldpostgresdialectv9sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v9.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v9.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/old/postgres-dialect/v9.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> -- -*- test-case-name: txdav.caldav.datastore.test.test_sql,txdav.carddav.datastore.test.test_sql -*-
</span><span class="cx"> 
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_10_to_11sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_10_to_11.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_10_to_11.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_10_to_11.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_11_to_12sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_11_to_12.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_11_to_12.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_11_to_12.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_12_to_13sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_12_to_13.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_12_to_13.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_12_to_13.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_13_to_14sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_13_to_14.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_13_to_14.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_13_to_14.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_14_to_15sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_14_to_15.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_14_to_15.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_14_to_15.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_15_to_16sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_15_to_16.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_15_to_16.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_15_to_16.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_16_to_17sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_16_to_17.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_16_to_17.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_16_to_17.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_17_to_18sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_17_to_18.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_17_to_18.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_17_to_18.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_18_to_19sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_18_to_19.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_18_to_19.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_18_to_19.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_19_to_20sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_19_to_20.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_19_to_20.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_19_to_20.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_20_to_21sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_20_to_21.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_20_to_21.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_20_to_21.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_21_to_22sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_21_to_22.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_21_to_22.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_21_to_22.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_22_to_23sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_22_to_23.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_22_to_23.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_22_to_23.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_23_to_24sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_23_to_24.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_23_to_24.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_23_to_24.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_24_to_25sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_24_to_25.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_24_to_25.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_24_to_25.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_25_to_26sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_25_to_26.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_25_to_26.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_25_to_26.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_26_to_27sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_26_to_27.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_26_to_27.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_26_to_27.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span><span class="lines">@@ -18,13 +18,10 @@
</span><span class="cx"> -- Upgrade database schema from VERSION 26 to 27 --
</span><span class="cx"> ---------------------------------------------------
</span><span class="cx"> 
</span><del>--- Calendar home related updates
</del><ins>+-- New index
</ins><span class="cx"> 
</span><del>-alter table CALENDAR_HOME_METADATA
- add (&quot;DEFAULT_POLLS&quot; integer default null references CALENDAR on delete set null);
-
-create index CALENDAR_HOME_METADAT_910264ce on CALENDAR_HOME_METADATA (
-    DEFAULT_POLLS
</del><ins>+create index ATTACHMENT_DROPBOX_ID_5073cf23 on ATTACHMENT (
+    DROPBOX_ID
</ins><span class="cx"> );
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_27_to_28sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_27_to_28.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_27_to_28.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_27_to_28.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_28_to_29sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_28_to_29.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_28_to_29.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_28_to_29.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span><span class="lines">@@ -18,21 +18,16 @@
</span><span class="cx"> -- Upgrade database schema from VERSION 28 to 29 --
</span><span class="cx"> ---------------------------------------------------
</span><span class="cx"> 
</span><del>--- Sharing notification related updates
</del><ins>+-- Calendar home related updates
</ins><span class="cx"> 
</span><del>-alter table NOTIFICATION_HOME
- add (&quot;DATAVERSION&quot; integer default 0 not null);
</del><ins>+alter table CALENDAR_HOME_METADATA
+ add (&quot;DEFAULT_POLLS&quot; integer default null references CALENDAR on delete set null);
</ins><span class="cx"> 
</span><del>-alter table NOTIFICATION
-  rename column XML_TYPE to NOTIFICATION_TYPE;
-alter table NOTIFICATION
-  rename column XML_DATA to NOTIFICATION_DATA;
</del><ins>+create index CALENDAR_HOME_METADAT_910264ce on CALENDAR_HOME_METADATA (
+    DEFAULT_POLLS
+);
</ins><span class="cx"> 
</span><del>-  -- Sharing enumeration updates
-insert into CALENDAR_BIND_MODE (DESCRIPTION, ID) values ('indirect', 4);
</del><span class="cx"> 
</span><del>-insert into CALENDAR_BIND_STATUS (DESCRIPTION, ID) values ('deleted', 4);
-
</del><span class="cx"> -- Now update the version
</span><ins>+-- No data upgrades
</ins><span class="cx"> update CALENDARSERVER set VALUE = '29' where NAME = 'VERSION';
</span><del>-insert into CALENDARSERVER (NAME, VALUE) values ('NOTIFICATION-DATAVERSION', '1');
</del></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_29_to_30sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_29_to_30.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_29_to_30.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_29_to_30.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span><span class="lines">@@ -18,35 +18,21 @@
</span><span class="cx"> -- Upgrade database schema from VERSION 29 to 30 --
</span><span class="cx"> ---------------------------------------------------
</span><span class="cx"> 
</span><del>-----------------------------------------
--- Change Address Book Object Members --
-----------------------------------------
</del><ins>+-- Sharing notification related updates
</ins><span class="cx"> 
</span><del>-begin
-for i in (select constraint_name from user_cons_columns where column_name = 'MEMBER_ID' or column_name = 'GROUP_ID')
-loop
-execute immediate 'alter table abo_members drop constraint' || i.constraint_name;
-end loop;
-end;
</del><ins>+alter table NOTIFICATION_HOME
+ add (&quot;DATAVERSION&quot; integer default 0 not null);
</ins><span class="cx"> 
</span><del>-alter table ABO_MEMBERS
-        add (&quot;REVISION&quot; integer default nextval('REVISION_SEQ') not null);
-alter table ABO_MEMBERS
-        add (&quot;REMOVED&quot; boolean default false not null);
-alter table ABO_MEMBERS
-         drop primary key;
-alter table ABO_MEMBERS
-         add primary key (&quot;GROUP_ID&quot;, &quot;MEMBER_ID&quot;, &quot;REVISION&quot;);
</del><ins>+alter table NOTIFICATION
+  rename column XML_TYPE to NOTIFICATION_TYPE;
+alter table NOTIFICATION
+  rename column XML_DATA to NOTIFICATION_DATA;
</ins><span class="cx"> 
</span><del>-------------------------------------------
--- Change Address Book Object Revisions --
-------------------------------------------
-        
-alter table ADDRESSBOOK_OBJECT_REVISIONS
-        add (&quot;OBJECT_RESOURCE_ID&quot; integer default 0);
</del><ins>+  -- Sharing enumeration updates
+insert into CALENDAR_BIND_MODE (DESCRIPTION, ID) values ('indirect', 4);
</ins><span class="cx"> 
</span><del>---------------------
--- Update version --
---------------------
</del><ins>+insert into CALENDAR_BIND_STATUS (DESCRIPTION, ID) values ('deleted', 4);
</ins><span class="cx"> 
</span><ins>+-- Now update the version
</ins><span class="cx"> update CALENDARSERVER set VALUE = '30' where NAME = 'VERSION';
</span><ins>+insert into CALENDARSERVER (NAME, VALUE) values ('NOTIFICATION-DATAVERSION', '1');
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_30_to_31sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_30_to_31.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_30_to_31.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_30_to_31.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1 +1,52 @@
</span><ins>+----
+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
+--
+-- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+----
+
+---------------------------------------------------
+-- Upgrade database schema from VERSION 30 to 31 --
+---------------------------------------------------
+
+----------------------------------------
+-- Change Address Book Object Members --
+----------------------------------------
+
+begin
+for i in (select constraint_name from user_cons_columns where column_name = 'MEMBER_ID' or column_name = 'GROUP_ID')
+loop
+execute immediate 'alter table abo_members drop constraint' || i.constraint_name;
+end loop;
+end;
+
+alter table ABO_MEMBERS
+        add (&quot;REVISION&quot; integer not null);
+alter table ABO_MEMBERS
+        add (&quot;REMOVED&quot; integer default 0 not null);
+alter table ABO_MEMBERS
+         drop primary key;
+alter table ABO_MEMBERS
+         add primary key (&quot;GROUP_ID&quot;, &quot;MEMBER_ID&quot;, &quot;REVISION&quot;);
+
+------------------------------------------
+-- Change Address Book Object Revisions --
+------------------------------------------
+        
+alter table ADDRESSBOOK_OBJECT_REVISIONS
+        add (&quot;OBJECT_RESOURCE_ID&quot; integer default 0);
+
+--------------------
+-- Update version --
+--------------------
+
</ins><span class="cx"> update CALENDARSERVER set VALUE = '31' where NAME = 'VERSION';
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_31_to_32sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_31_to_32.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_31_to_32.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_31_to_32.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1 +1,53 @@
</span><ins>+----
+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
+--
+-- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+----
+
+---------------------------------------------------
+-- Upgrade database schema from VERSION 31 to 32 --
+---------------------------------------------------
+
+-- Home related updates
+
+alter table CALENDAR_HOME
+ add (&quot;STATUS&quot; integer default 0 not null);
+
+alter table NOTIFICATION_HOME
+ add (&quot;STATUS&quot; integer default 0 not null);
+
+alter table ADDRESSBOOK_HOME
+ add (&quot;STATUS&quot; integer default 0 not null);
+
+create table HOME_STATUS (
+    &quot;ID&quot; integer primary key,
+    &quot;DESCRIPTION&quot; nvarchar2(16) unique
+);
+
+insert into HOME_STATUS (DESCRIPTION, ID) values ('normal', 0);
+insert into HOME_STATUS (DESCRIPTION, ID) values ('external', 1);
+
+-- Bind changes
+alter table CALENDAR_BIND
+ add (&quot;EXTERNAL_ID&quot; integer default null);
+
+alter table SHARED_ADDRESSBOOK_BIND
+ add (&quot;EXTERNAL_ID&quot; integer default null);
+
+alter table SHARED_GROUP_BIND
+ add (&quot;EXTERNAL_ID&quot; integer default null);
+
+
+-- Now update the version
+-- No data upgrades
</ins><span class="cx"> update CALENDARSERVER set VALUE = '32' where NAME = 'VERSION';
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_3_to_4sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_3_to_4.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_3_to_4.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_3_to_4.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_4_to_5sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_4_to_5.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_4_to_5.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_4_to_5.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_5_to_6sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_5_to_6.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_5_to_6.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_5_to_6.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_6_to_7sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_6_to_7.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_6_to_7.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_6_to_7.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_7_to_8sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_7_to_8.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_7_to_8.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_7_to_8.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_8_to_9sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_8_to_9.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_8_to_9.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_8_to_9.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesoracledialectupgrade_from_9_to_10sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_9_to_10.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_9_to_10.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_9_to_10.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_10_to_11sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_10_to_11.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_10_to_11.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_10_to_11.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_11_to_12sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_11_to_12.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_11_to_12.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_11_to_12.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_12_to_13sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_12_to_13.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_12_to_13.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_12_to_13.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_13_to_14sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_13_to_14.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_13_to_14.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_13_to_14.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_14_to_15sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_14_to_15.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_14_to_15.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_14_to_15.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_15_to_16sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_15_to_16.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_15_to_16.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_15_to_16.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_16_to_17sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_16_to_17.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_16_to_17.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_16_to_17.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_17_to_18sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_17_to_18.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_17_to_18.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_17_to_18.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_18_to_19sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_18_to_19.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_18_to_19.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_18_to_19.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_19_to_20sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_19_to_20.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_19_to_20.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_19_to_20.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_20_to_21sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_20_to_21.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_20_to_21.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_20_to_21.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_21_to_22sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_21_to_22.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_21_to_22.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_21_to_22.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_22_to_23sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_22_to_23.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_22_to_23.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_22_to_23.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_23_to_24sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_23_to_24.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_23_to_24.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_23_to_24.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_24_to_25sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_24_to_25.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_24_to_25.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_24_to_25.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_25_to_26sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_25_to_26.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_25_to_26.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_25_to_26.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_26_to_27sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_26_to_27.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_26_to_27.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_26_to_27.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span><span class="lines">@@ -18,13 +18,11 @@
</span><span class="cx"> -- Upgrade database schema from VERSION 26 to 27 --
</span><span class="cx"> ---------------------------------------------------
</span><span class="cx"> 
</span><del>--- Calendar home related updates
</del><ins>+-- New index
</ins><span class="cx"> 
</span><del>-alter table CALENDAR_HOME_METADATA
- add column DEFAULT_POLLS integer default null references CALENDAR on delete set null;
</del><ins>+create index ATTACHMENT_DROPBOX_ID on
+  ATTACHMENT(DROPBOX_ID);
</ins><span class="cx"> 
</span><del>-create index CALENDAR_HOME_METADATA_DEFAULT_POLLS on
-        CALENDAR_HOME_METADATA(DEFAULT_POLLS);
</del><span class="cx"> 
</span><span class="cx"> -- Now update the version
</span><span class="cx"> -- No data upgrades
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_27_to_28sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_27_to_28.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_27_to_28.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_27_to_28.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_28_to_29sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_28_to_29.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_28_to_29.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_28_to_29.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span><span class="lines">@@ -18,21 +18,14 @@
</span><span class="cx"> -- Upgrade database schema from VERSION 28 to 29 --
</span><span class="cx"> ---------------------------------------------------
</span><span class="cx"> 
</span><del>--- Sharing notification related updates
</del><ins>+-- Calendar home related updates
</ins><span class="cx"> 
</span><del>-alter table NOTIFICATION_HOME
-  add column DATAVERSION integer default 0 not null;
</del><ins>+alter table CALENDAR_HOME_METADATA
+ add column DEFAULT_POLLS integer default null references CALENDAR on delete set null;
</ins><span class="cx"> 
</span><del>-alter table NOTIFICATION
-  rename column XML_TYPE to NOTIFICATION_TYPE;
-alter table NOTIFICATION
-  rename column XML_DATA to NOTIFICATION_DATA;
</del><ins>+create index CALENDAR_HOME_METADATA_DEFAULT_POLLS on
+        CALENDAR_HOME_METADATA(DEFAULT_POLLS);
</ins><span class="cx"> 
</span><del>--- Sharing enumeration updates
-insert into CALENDAR_BIND_MODE values (4, 'indirect');
-
-insert into CALENDAR_BIND_STATUS values (4, 'deleted');
-
</del><span class="cx"> -- Now update the version
</span><ins>+-- No data upgrades
</ins><span class="cx"> update CALENDARSERVER set VALUE = '29' where NAME = 'VERSION';
</span><del>-insert into CALENDARSERVER values ('NOTIFICATION-DATAVERSION', '1');
</del></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_29_to_30sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_29_to_30.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_29_to_30.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_29_to_30.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span><span class="lines">@@ -18,27 +18,21 @@
</span><span class="cx"> -- Upgrade database schema from VERSION 29 to 30 --
</span><span class="cx"> ---------------------------------------------------
</span><span class="cx"> 
</span><del>-----------------------------------------
--- Change Address Book Object Members --
-----------------------------------------
</del><ins>+-- Sharing notification related updates
</ins><span class="cx"> 
</span><del>-alter table ABO_MEMBERS
-        drop constraint        abo_members_member_id_fkey,
-        drop constraint        abo_members_group_id_fkey,
-        add column        REVISION                integer      default nextval('REVISION_SEQ') not null,
-        add column        REMOVED         boolean      default false not null,
-        drop constraint abo_members_pkey,
-        add constraint abo_members_pkey primary key(GROUP_ID, MEMBER_ID, REVISION);
</del><ins>+alter table NOTIFICATION_HOME
+  add column DATAVERSION integer default 0 not null;
</ins><span class="cx"> 
</span><del>-------------------------------------------
--- Change Address Book Object Revisions --
-------------------------------------------
-        
-alter table ADDRESSBOOK_OBJECT_REVISIONS
-        add column OBJECT_RESOURCE_ID integer default 0;
-        
---------------------
--- Update version --
---------------------
</del><ins>+alter table NOTIFICATION
+  rename column XML_TYPE to NOTIFICATION_TYPE;
+alter table NOTIFICATION
+  rename column XML_DATA to NOTIFICATION_DATA;
</ins><span class="cx"> 
</span><ins>+-- Sharing enumeration updates
+insert into CALENDAR_BIND_MODE values (4, 'indirect');
+
+insert into CALENDAR_BIND_STATUS values (4, 'deleted');
+
+-- Now update the version
</ins><span class="cx"> update CALENDARSERVER set VALUE = '30' where NAME = 'VERSION';
</span><ins>+insert into CALENDARSERVER values ('NOTIFICATION-DATAVERSION', '1');
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_30_to_31sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_30_to_31.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_30_to_31.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_30_to_31.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1 +1,44 @@
</span><ins>+----
+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
+--
+-- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+----
+
+---------------------------------------------------
+-- Upgrade database schema from VERSION 30 to 31 --
+---------------------------------------------------
+
+----------------------------------------
+-- Change Address Book Object Members --
+----------------------------------------
+
+alter table ABO_MEMBERS
+        drop constraint        abo_members_member_id_fkey,
+        drop constraint        abo_members_group_id_fkey,
+        add column        REVISION                integer      default nextval('REVISION_SEQ') not null,
+        add column        REMOVED         boolean      default false not null,
+        drop constraint abo_members_pkey,
+        add constraint abo_members_pkey primary key(GROUP_ID, MEMBER_ID, REVISION);
+
+------------------------------------------
+-- Change Address Book Object Revisions --
+------------------------------------------
+        
+alter table ADDRESSBOOK_OBJECT_REVISIONS
+        add column OBJECT_RESOURCE_ID integer default 0;
+        
+--------------------
+-- Update version --
+--------------------
+
</ins><span class="cx"> update CALENDARSERVER set VALUE = '31' where NAME = 'VERSION';
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_31_to_32sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_31_to_32.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_31_to_32.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_31_to_32.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1 +1,55 @@
</span><ins>+----
+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
+--
+-- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+----
+
+---------------------------------------------------
+-- Upgrade database schema from VERSION 31 to 32 --
+---------------------------------------------------
+
+-- Home related updates
+
+alter table CALENDAR_HOME
+ add column STATUS integer default 0 not null;
+
+alter table NOTIFICATION_HOME
+ add column STATUS integer default 0 not null;
+
+alter table ADDRESSBOOK_HOME
+ add column STATUS integer default 0 not null;
+
+-- Enumeration of statuses
+
+create table HOME_STATUS (
+  ID          integer     primary key,
+  DESCRIPTION varchar(16) not null unique
+);
+
+insert into HOME_STATUS values (0, 'normal' );
+insert into HOME_STATUS values (1, 'external');
+
+-- Bind changes
+alter table CALENDAR_BIND
+ add column EXTERNAL_ID integer default null;
+
+alter table SHARED_ADDRESSBOOK_BIND
+ add column EXTERNAL_ID integer default null;
+
+alter table SHARED_GROUP_BIND
+ add column EXTERNAL_ID integer default null;
+
+
+-- Now update the version
+-- No data upgrades
</ins><span class="cx"> update CALENDARSERVER set VALUE = '32' where NAME = 'VERSION';
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_3_to_4sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_3_to_4.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_3_to_4.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_3_to_4.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_4_to_5sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_4_to_5.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_4_to_5.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_4_to_5.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_5_to_6sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_5_to_6.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_5_to_6.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_5_to_6.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_6_to_7sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_6_to_7.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_6_to_7.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_6_to_7.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_7_to_8sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_7_to_8.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_7_to_8.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_7_to_8.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_8_to_9sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_8_to_9.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_8_to_9.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_8_to_9.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradespostgresdialectupgrade_from_9_to_10sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_9_to_10.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_9_to_10.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_9_to_10.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_schemaupgradesupgrade_templatesql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/upgrade_template.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/upgrade_template.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_schema/upgrades/upgrade_template.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoresql_tablespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_tables.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_tables.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/sql_tables.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.common.datastore.test.test_sql_tables -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -133,6 +133,15 @@
</span><span class="cx"> 
</span><span class="cx"> # Various constants
</span><span class="cx"> 
</span><ins>+_homeStatus = _schemaConstants(
+    schema.HOME_STATUS.DESCRIPTION,
+    schema.HOME_STATUS.ID
+)
+
+
+_HOME_STATUS_NORMAL = _homeStatus('normal')
+_HOME_STATUS_EXTERNAL = _homeStatus('external')
+
</ins><span class="cx"> _bindStatus = _schemaConstants(
</span><span class="cx">     schema.CALENDAR_BIND_STATUS.DESCRIPTION,
</span><span class="cx">     schema.CALENDAR_BIND_STATUS.ID
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoretest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.carddav.datastore.test -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoretesttest_sqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/test_sql.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/test_sql.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/test_sql.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -19,21 +19,28 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx"> from twext.enterprise.dal.syntax import Select
</span><del>-from txdav.xml import element as davxml
</del><ins>+from twext.enterprise.dal.syntax import Insert
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> from twisted.internet.task import Clock
</span><span class="cx"> from twisted.trial.unittest import TestCase
</span><span class="cx"> from twisted.internet.defer import Deferred
</span><span class="cx"> 
</span><ins>+from txdav.caldav.datastore.test.util import buildDirectoryRecord
</ins><span class="cx"> from txdav.common.datastore.sql import log, CommonStoreTransactionMonitor, \
</span><span class="cx">     CommonHome, CommonHomeChild, ECALENDARTYPE
</span><span class="cx"> from txdav.common.datastore.sql_tables import schema
</span><span class="cx"> from txdav.common.datastore.test.util import CommonCommonTests, buildStore
</span><span class="cx"> from txdav.common.icommondatastore import AllRetriesFailed
</span><del>-from twext.enterprise.dal.syntax import Insert
</del><span class="cx"> from txdav.common.datastore.sql import fixUUIDNormalization
</span><ins>+from txdav.xml import element as davxml
</ins><span class="cx"> 
</span><ins>+from uuid import UUID
+
+exampleUID = UUID(&quot;a&quot; * 32)
+denormalizedUID = str(exampleUID)
+normalizedUID = denormalizedUID.upper()
+
</ins><span class="cx"> class CommonSQLStoreTests(CommonCommonTests, TestCase):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Tests for shared functionality in L{txdav.common.datastore.sql}.
</span><span class="lines">@@ -46,6 +53,9 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         yield super(CommonSQLStoreTests, self).setUp()
</span><span class="cx">         self._sqlStore = yield buildStore(self, self.notifierFactory)
</span><ins>+        self._sqlStore.directoryService().addRecord(buildDirectoryRecord(denormalizedUID))
+        self._sqlStore.directoryService().addRecord(buildDirectoryRecord(normalizedUID))
+        self._sqlStore.directoryService().addRecord(buildDirectoryRecord(&quot;uid&quot;))
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def storeUnderTest(self):
</span><span class="lines">@@ -118,10 +128,12 @@
</span><span class="cx">         self.patch(log, &quot;error&quot;, counter)
</span><span class="cx"> 
</span><span class="cx">         txn = self.transactionUnderTest()
</span><ins>+        self.assertFalse(txn.timedout)
</ins><span class="cx"> 
</span><span class="cx">         c.advance(2)
</span><span class="cx">         self.assertNotEqual(ctr[0], 0)
</span><span class="cx">         self.assertTrue(txn._sqlTxn._completed)
</span><ins>+        self.assertTrue(txn.timedout)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def test_logWaitsAndTxnTimeout(self):
</span><span class="lines">@@ -308,31 +320,31 @@
</span><span class="cx">         token = yield homeChild.syncToken()
</span><span class="cx">         yield homeChild._changeRevision(&quot;insert&quot;, &quot;C&quot;)
</span><span class="cx">         changed = yield homeChild.resourceNamesSinceToken(token)
</span><del>-        self.assertEqual(changed, ([&quot;C&quot;], [],))
</del><ins>+        self.assertEqual(changed, ([&quot;C&quot;], [], [],))
</ins><span class="cx"> 
</span><span class="cx">         # update test
</span><span class="cx">         token = yield homeChild.syncToken()
</span><span class="cx">         yield homeChild._changeRevision(&quot;update&quot;, &quot;C&quot;)
</span><span class="cx">         changed = yield homeChild.resourceNamesSinceToken(token)
</span><del>-        self.assertEqual(changed, ([&quot;C&quot;], [],))
</del><ins>+        self.assertEqual(changed, ([&quot;C&quot;], [], [],))
</ins><span class="cx"> 
</span><span class="cx">         # delete test
</span><span class="cx">         token = yield homeChild.syncToken()
</span><span class="cx">         yield homeChild._changeRevision(&quot;delete&quot;, &quot;C&quot;)
</span><span class="cx">         changed = yield homeChild.resourceNamesSinceToken(token)
</span><del>-        self.assertEqual(changed, ([], [&quot;C&quot;],))
</del><ins>+        self.assertEqual(changed, ([], [&quot;C&quot;], [],))
</ins><span class="cx"> 
</span><span class="cx">         # missing update test
</span><span class="cx">         token = yield homeChild.syncToken()
</span><span class="cx">         yield homeChild._changeRevision(&quot;update&quot;, &quot;D&quot;)
</span><span class="cx">         changed = yield homeChild.resourceNamesSinceToken(token)
</span><del>-        self.assertEqual(changed, ([&quot;D&quot;], [],))
</del><ins>+        self.assertEqual(changed, ([&quot;D&quot;], [], [],))
</ins><span class="cx"> 
</span><span class="cx">         # missing delete test
</span><span class="cx">         token = yield homeChild.syncToken()
</span><span class="cx">         yield homeChild._changeRevision(&quot;delete&quot;, &quot;E&quot;)
</span><span class="cx">         changed = yield homeChild.resourceNamesSinceToken(token)
</span><del>-        self.assertEqual(changed, ([], [],))
</del><ins>+        self.assertEqual(changed, ([], [], [],))
</ins><span class="cx"> 
</span><span class="cx">         yield txn.abort()
</span><span class="cx"> 
</span><span class="lines">@@ -421,10 +433,3 @@
</span><span class="cx">         yield fixUUIDNormalization(self.storeUnderTest())
</span><span class="cx">         self.assertEqual((yield self.allHomeUIDs(schema.ADDRESSBOOK_HOME)),
</span><span class="cx">                          [[normalizedUID]])
</span><del>-
-
-
-from uuid import UUID
-exampleUID = UUID(&quot;a&quot; * 32)
-denormalizedUID = str(exampleUID)
-normalizedUID = denormalizedUID.upper()
</del></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoretesttest_sql_schema_filespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/test_sql_schema_files.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/test_sql_schema_files.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/test_sql_schema_files.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> # #
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoretesttest_sql_tablespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/test_sql_tables.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/test_sql_tables.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/test_sql_tables.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.caldav.datastore.test.test_sql -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -387,7 +387,7 @@
</span><span class="cx">         realsql = dedent(
</span><span class="cx">         '''
</span><span class="cx">         ----
</span><del>-        -- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+        -- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx">         --
</span><span class="cx">         -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx">         -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoretestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/test/util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.carddav.datastore.test -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -112,12 +112,14 @@
</span><span class="cx">     def recordWithUID(self, uid):
</span><span class="cx">         return self.records.get(uid)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def recordWithGUID(self, guid):
</span><span class="cx">         for record in self.records.itervalues():
</span><span class="cx">             if record.guid == guid:
</span><span class="cx">                 return record
</span><span class="cx">         return None
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def addRecord(self, record):
</span><span class="cx">         self.records[record.uid] = record
</span><span class="cx"> 
</span><span class="lines">@@ -127,32 +129,70 @@
</span><span class="cx"> 
</span><span class="cx">     implements(IStoreDirectoryRecord)
</span><span class="cx"> 
</span><del>-    def __init__(self, uid, shortNames, fullName, extras={}):
</del><ins>+    def __init__(self, uid, shortNames, fullName, thisServer=True, server=None, extras={}):
</ins><span class="cx">         self.uid = uid
</span><span class="cx">         self.guid = uid
</span><span class="cx">         self.shortNames = shortNames
</span><span class="cx">         self.fullName = fullName
</span><span class="cx">         self.displayName = self.fullName if self.fullName else self.shortNames[0]
</span><ins>+        self._thisServer = thisServer
+        self._server = server
</ins><span class="cx">         self.extras = extras
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def thisServer(self):
+        return self._thisServer
</ins><span class="cx"> 
</span><ins>+
+    def server(self):
+        return self._server
+
+
+
+def buildDirectory(homes=None):
+
+    directory = TestStoreDirectoryService()
+
+    # User accounts
+    for ctr in range(1, 100):
+        directory.addRecord(TestStoreDirectoryRecord(
+            &quot;user%02d&quot; % (ctr,),
+            (&quot;user%02d&quot; % (ctr,),),
+            &quot;User %02d&quot; % (ctr,),
+        ))
+
+    homes = set(homes) if homes is not None else set()
+    for uid in homes:
+        directory.addRecord(buildDirectoryRecord(uid))
+
+    return directory
+
+
+
+def buildDirectoryRecord(uid):
+    return TestStoreDirectoryRecord(
+        uid,
+        (uid,),
+        uid.capitalize(),
+    )
+
+
+
</ins><span class="cx"> class SQLStoreBuilder(object):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Test-fixture-builder which can construct a PostgresStore.
</span><span class="cx">     &quot;&quot;&quot;
</span><del>-    sharedService = None
-    currentTestID = None
</del><ins>+    def __init__(self, secondary=False):
+        self.sharedService = None
+        self.currentTestID = None
+        self.sharedDBPath = &quot;_test_sql_db&quot; + str(os.getpid()) + (&quot;-2&quot; if secondary else &quot;&quot;)
</ins><span class="cx"> 
</span><del>-    SHARED_DB_PATH = &quot;_test_sql_db&quot; + str(os.getpid())
</del><span class="cx"> 
</span><del>-
-    @classmethod
-    def createService(cls, serviceFactory):
</del><ins>+    def createService(self, serviceFactory):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Create a L{PostgresService} to use for building a store.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        dbRoot = CachingFilePath(cls.SHARED_DB_PATH)
</del><ins>+        dbRoot = CachingFilePath(self.sharedDBPath)
</ins><span class="cx">         return PostgresService(
</span><span class="cx">             dbRoot, serviceFactory, current_sql_schema, resetSchema=True,
</span><span class="cx">             databaseName=&quot;caldav&quot;,
</span><span class="lines">@@ -168,17 +208,15 @@
</span><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    @classmethod
-    def childStore(cls):
</del><ins>+    def childStore(self):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Create a store suitable for use in a child process, that is hooked up
</span><span class="cx">         to the store that a parent test process is managing.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         disableMemcacheForTest(TestCase())
</span><span class="cx">         staticQuota = 3000
</span><del>-        attachmentRoot = (CachingFilePath(cls.SHARED_DB_PATH)
-                          .child(&quot;attachments&quot;))
-        stubsvc = cls.createService(lambda cf: Service())
</del><ins>+        attachmentRoot = (CachingFilePath(self.sharedDBPath).child(&quot;attachments&quot;))
+        stubsvc = self.createService(lambda cf: Service())
</ins><span class="cx"> 
</span><span class="cx">         cp = ConnectionPool(stubsvc.produceConnection, maxConnections=1)
</span><span class="cx">         # Attach the service to the running reactor.
</span><span class="lines">@@ -194,17 +232,17 @@
</span><span class="cx">         return cds
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def buildStore(self, testCase, notifierFactory, directoryService=None):
</del><ins>+    def buildStore(self, testCase, notifierFactory, directoryService=None, homes=None):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Do the necessary work to build a store for a particular test case.
</span><span class="cx"> 
</span><span class="cx">         @return: a L{Deferred} which fires with an L{IDataStore}.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         disableMemcacheForTest(testCase)
</span><del>-        dbRoot = CachingFilePath(self.SHARED_DB_PATH)
</del><ins>+        dbRoot = CachingFilePath(self.sharedDBPath)
</ins><span class="cx">         attachmentRoot = dbRoot.child(&quot;attachments&quot;)
</span><span class="cx">         if directoryService is None:
</span><del>-            directoryService = TestStoreDirectoryService()
</del><ins>+            directoryService = buildDirectory(homes=homes)
</ins><span class="cx">         if self.sharedService is None:
</span><span class="cx">             ready = Deferred()
</span><span class="cx">             def getReady(connectionFactory, storageService):
</span><span class="lines">@@ -251,8 +289,7 @@
</span><span class="cx">         attachmentRoot.createDirectory()
</span><span class="cx"> 
</span><span class="cx">         currentTestID = testCase.id()
</span><del>-        cp = ConnectionPool(self.sharedService.produceConnection,
-                            maxConnections=5)
</del><ins>+        cp = ConnectionPool(self.sharedService.produceConnection, maxConnections=5)
</ins><span class="cx">         quota = deriveQuota(testCase)
</span><span class="cx">         store = CommonDataStore(
</span><span class="cx">             cp.connection,
</span><span class="lines">@@ -314,6 +351,7 @@
</span><span class="cx"> 
</span><span class="cx"> theStoreBuilder = SQLStoreBuilder()
</span><span class="cx"> buildStore = theStoreBuilder.buildStore
</span><ins>+cleanStore = theStoreBuilder.cleanStore
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> _notSet = object()
</span><span class="lines">@@ -685,13 +723,13 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def homeUnderTest(self, txn=None, name=&quot;home1&quot;):
</del><ins>+    def homeUnderTest(self, txn=None, name=&quot;home1&quot;, create=False):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Get the calendar home detailed by C{requirements['home1']}.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         if txn is None:
</span><span class="cx">             txn = self.transactionUnderTest()
</span><del>-        returnValue((yield txn.calendarHomeWithUID(name)))
</del><ins>+        returnValue((yield txn.calendarHomeWithUID(name, create=create)))
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgrade__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradefile__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/file/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/file/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/file/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgrademigratepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/migrate.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/migrate.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/migrate.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.common.datastore.upgrade.test.test_migrate -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesql__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlothers__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/others/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/others/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/others/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlothersattachment_migrationpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/others/attachment_migration.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/others/attachment_migration.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/others/attachment_migration.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlotherstest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/others/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/others/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/others/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlotherstesttest_attachment_migrationpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/others/test/test_attachment_migration.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/others/test/test_attachment_migration.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/others/test/test_attachment_migration.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltestfake_schema1currentsql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema1/current.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema1/current.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema1/current.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltestfake_schema1upgradesfake_dialectupgrade_from_3_to_4sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema1/upgrades/fake_dialect/upgrade_from_3_to_4.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema1/upgrades/fake_dialect/upgrade_from_3_to_4.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema1/upgrades/fake_dialect/upgrade_from_3_to_4.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltestfake_schema2currentsql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema2/current.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema2/current.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema2/current.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltestfake_schema2upgradesfake_dialectupgrade_from_3_to_4sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema2/upgrades/fake_dialect/upgrade_from_3_to_4.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema2/upgrades/fake_dialect/upgrade_from_3_to_4.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema2/upgrades/fake_dialect/upgrade_from_3_to_4.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltestfake_schema2upgradesfake_dialectupgrade_from_3_to_5sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema2/upgrades/fake_dialect/upgrade_from_3_to_5.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema2/upgrades/fake_dialect/upgrade_from_3_to_5.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema2/upgrades/fake_dialect/upgrade_from_3_to_5.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltestfake_schema2upgradesfake_dialectupgrade_from_4_to_5sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema2/upgrades/fake_dialect/upgrade_from_4_to_5.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema2/upgrades/fake_dialect/upgrade_from_4_to_5.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema2/upgrades/fake_dialect/upgrade_from_4_to_5.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltestfake_schema3currentsql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema3/current.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema3/current.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema3/current.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltestfake_schema3upgradesfake_dialectupgrade_from_3_to_4sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema3/upgrades/fake_dialect/upgrade_from_3_to_4.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema3/upgrades/fake_dialect/upgrade_from_3_to_4.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema3/upgrades/fake_dialect/upgrade_from_3_to_4.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltestfake_schema3upgradesfake_dialectupgrade_from_4_to_5sql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema3/upgrades/fake_dialect/upgrade_from_4_to_5.sql (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema3/upgrades/fake_dialect/upgrade_from_4_to_5.sql        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/fake_schema3/upgrades/fake_dialect/upgrade_from_4_to_5.sql        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ----
</span><del>--- Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+-- Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> --
</span><span class="cx"> -- Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> -- you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqltesttest_upgradepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/test_upgrade.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/test_upgrade.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/test/test_upgrade.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrade.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrade.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrade.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.common.datastore.upgrade.sql.test -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgrades__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradesaddressbook_upgrade_from_1_to_2py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/addressbook_upgrade_from_1_to_2.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/addressbook_upgrade_from_1_to_2.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/addressbook_upgrade_from_1_to_2.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.common.datastore.upgrade.sql.test -*-
</span><span class="cx"> # #
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradescalendar_upgrade_from_1_to_2py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_1_to_2.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_1_to_2.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_1_to_2.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.common.datastore.upgrade.sql.test -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradescalendar_upgrade_from_2_to_3py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_2_to_3.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_2_to_3.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_2_to_3.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.common.datastore.upgrade.sql.test -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradescalendar_upgrade_from_3_to_4py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_3_to_4.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_3_to_4.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_3_to_4.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.common.datastore.upgrade.sql.test -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradescalendar_upgrade_from_4_to_5py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_4_to_5.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_4_to_5.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_4_to_5.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.common.datastore.upgrade.sql.test -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradesnotification_upgrade_from_0_to_1py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/notification_upgrade_from_0_to_1.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/notification_upgrade_from_0_to_1.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/notification_upgrade_from_0_to_1.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txdav.common.datastore.upgrade.sql.test -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradestest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradestesttest_notification_upgrade_from_0_to_1py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/test/test_notification_upgrade_from_0_to_1.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/test/test_notification_upgrade_from_0_to_1.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/test/test_notification_upgrade_from_0_to_1.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradestesttest_upgrade_from_3_to_4py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/test/test_upgrade_from_3_to_4.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/test/test_upgrade_from_3_to_4.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/test/test_upgrade_from_3_to_4.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradestesttest_upgrade_from_4_to_5py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/test/test_upgrade_from_4_to_5.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/test/test_upgrade_from_4_to_5.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/test/test_upgrade_from_4_to_5.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradesqlupgradesutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/sql/upgrades/util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -19,7 +19,7 @@
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> from txdav.base.propertystore.base import PropertyName
</span><span class="cx"> from txdav.base.propertystore.sql import PropertyStore
</span><del>-from txdav.common.datastore.sql_tables import schema
</del><ins>+from txdav.common.datastore.sql_tables import schema, _HOME_STATUS_EXTERNAL
</ins><span class="cx"> from twisted.python.failure import Failure
</span><span class="cx"> 
</span><span class="cx"> log = Logger()
</span><span class="lines">@@ -134,7 +134,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> @inlineCallbacks
</span><del>-def doToEachHomeNotAtVersion(store, homeSchema, version, doIt, logStr, filterOwnerUID=None):
</del><ins>+def doToEachHomeNotAtVersion(store, homeSchema, version, doIt, logStr, filterOwnerUID=None, processExternal=False):
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Do something to each home whose version column indicates it is older
</span><span class="cx">     than the specified version. Do this in batches as there may be a lot of work to do. Also,
</span><span class="lines">@@ -161,7 +161,7 @@
</span><span class="cx">         txn = store.newTransaction(&quot;updateDataVersion&quot;)
</span><span class="cx">         try:
</span><span class="cx">             rows = yield Select(
</span><del>-                [homeSchema.RESOURCE_ID, homeSchema.OWNER_UID, ],
</del><ins>+                [homeSchema.RESOURCE_ID, homeSchema.OWNER_UID, homeSchema.STATUS, ],
</ins><span class="cx">                 From=homeSchema,
</span><span class="cx">                 Where=where,
</span><span class="cx">                 OrderBy=homeSchema.OWNER_UID,
</span><span class="lines">@@ -173,9 +173,10 @@
</span><span class="cx">                 logUpgradeStatus(&quot;End {}&quot;.format(logStr), count, total)
</span><span class="cx">                 returnValue(None)
</span><span class="cx"> 
</span><del>-            # Apply to the home
-            homeResourceID, _ignore_owner_uid = rows[0]
-            yield doIt(txn, homeResourceID)
</del><ins>+            # Apply to the home if not external
+            homeResourceID, _ignore_owner_uid, homeStatus = rows[0]
+            if homeStatus != _HOME_STATUS_EXTERNAL or processExternal:
+                yield doIt(txn, homeResourceID)
</ins><span class="cx"> 
</span><span class="cx">             # Update the home to the current version
</span><span class="cx">             yield Update(
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradetest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreupgradetesttest_migratepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/test/test_migrate.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/test/test_migrate.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/upgrade/test/test_migrate.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -143,7 +143,17 @@
</span><span class="cx">             self.filesPath, {&quot;push&quot;: StubNotifierFactory()}, TestStoreDirectoryService(), True, True
</span><span class="cx">         )
</span><span class="cx">         self.sqlStore = yield theStoreBuilder.buildStore(
</span><del>-            self, StubNotifierFactory()
</del><ins>+            self,
+            StubNotifierFactory(),
+            homes=(
+                &quot;home1&quot;,
+                &quot;home2&quot;,
+                &quot;home3&quot;,
+                &quot;home_defaults&quot;,
+                &quot;home_no_splits&quot;,
+                &quot;home_splits&quot;,
+                &quot;home_splits_shared&quot;,
+            )
</ins><span class="cx">         )
</span><span class="cx">         self.upgrader = UpgradeToDatabaseStep(self.fileStore, self.sqlStore)
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommondatastoreworktesttest_revision_cleanuppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/work/test/test_revision_cleanup.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/work/test/test_revision_cleanup.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/datastore/work/test/test_revision_cleanup.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -315,10 +315,11 @@
</span><span class="cx">         otherAB = yield self.addressbookUnderTest(home=&quot;user02&quot;, name=&quot;user01&quot;)
</span><span class="cx">         self.assertNotEqual(otherAB._bindRevision, 0)
</span><span class="cx"> 
</span><del>-        changed, deleted = yield otherAB.resourceNamesSinceRevision(otherAB._bindRevision)
</del><ins>+        changed, deleted, invalid = yield otherAB.resourceNamesSinceRevision(otherAB._bindRevision)
</ins><span class="cx">         print(&quot;test_addressbookMembersRevisions changed=%s deleted=%s&quot; % (changed, deleted,))
</span><span class="cx">         self.assertEqual(changed, [&quot;group1.vcf&quot;])
</span><span class="cx">         self.assertEqual(len(deleted), 0)
</span><ins>+        self.assertEqual(len(invalid), 0)
</ins><span class="cx"> 
</span><span class="cx">         otherHome = yield self.addressbookHomeUnderTest(name=&quot;user02&quot;)
</span><span class="cx">         for depth, result in (
</span><span class="lines">@@ -327,10 +328,11 @@
</span><span class="cx">             (&quot;infinity&quot;, ['user01/',
</span><span class="cx">                           'user01/group1.vcf']
</span><span class="cx">              )):
</span><del>-            changed, deleted = yield otherAB.viewerHome().resourceNamesSinceRevision(otherAB._bindRevision, depth)
</del><ins>+            changed, deleted, invalid = yield otherAB.viewerHome().resourceNamesSinceRevision(otherAB._bindRevision, depth)
</ins><span class="cx">             print(&quot;test_addressbookMembersRevisions depth=%s, changed=%s deleted=%s&quot; % (depth, changed, deleted,))
</span><span class="cx">             self.assertEqual(set(changed), set(result))
</span><span class="cx">             self.assertEqual(len(deleted), 0)
</span><ins>+            self.assertEqual(len(invalid), 0)
</ins><span class="cx"> 
</span><span class="cx">         yield self.commit()
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommonicommondatastorepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/icommondatastore.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/icommondatastore.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/icommondatastore.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -51,6 +51,13 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+class RecordNotAllowedError(CommonStoreError):
+    &quot;&quot;&quot;
+    User not allowed.
+    &quot;&quot;&quot;
+
+
+
</ins><span class="cx"> class NameNotAllowedError(CommonStoreError):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Attempt to create an object with a name that is not allowed.
</span><span class="lines">@@ -205,6 +212,29 @@
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
+class ShareNotAllowed(CommonStoreError):
+    &quot;&quot;&quot;
+    An operation on a shared resource is not allowed.
+    &quot;&quot;&quot;
+
+
+
+class ExternalShareFailed(CommonStoreError):
+    &quot;&quot;&quot;
+    An external sharee operation failed.
+    &quot;&quot;&quot;
+
+
+
+class NonExistentExternalShare(CommonStoreError):
+    &quot;&quot;&quot;
+    An external sharee operation failed because the share does not exist on the
+    other pod. The caller of the external request receiving this exception should
+    remove the local external share to &quot;heal&quot; this mismatch.
+    &quot;&quot;&quot;
+
+
</ins><span class="cx"> # Indexing / sync tokens
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommonidirectoryservicepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/idirectoryservice.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/idirectoryservice.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/idirectoryservice.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2013-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span><span class="lines">@@ -26,6 +26,20 @@
</span><span class="cx">     &quot;IStoreDirectoryRecord&quot;,
</span><span class="cx"> ]
</span><span class="cx"> 
</span><ins>+class IStoreDirectoryError(Exception):
+    &quot;&quot;&quot;
+    Base class for directory related errors.
+    &quot;&quot;&quot;
+
+
+
+class DirectoryRecordNotFoundError(Exception):
+    &quot;&quot;&quot;
+    Directory record not found.
+    &quot;&quot;&quot;
+
+
+
</ins><span class="cx"> class IStoreDirectoryService(Interface):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Directory Service for looking up users.
</span><span class="lines">@@ -48,6 +62,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class IStoreDirectoryRecord(Interface):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Directory record object
</span><span class="lines">@@ -62,3 +77,27 @@
</span><span class="cx">     fullName = Attribute(&quot;Full name for the entity associated with the record: C{str}&quot;)
</span><span class="cx"> 
</span><span class="cx">     displayName = Attribute(&quot;Display name for entity associated with the record: C{str}&quot;)
</span><ins>+
+    def serverURI(): #@NoSelf
+        &quot;&quot;&quot;
+        Return the URI for the record's server &quot;pod&quot;.
+
+        @return: a URI.
+        @rtype: C{str}
+        &quot;&quot;&quot;
+
+    def server(): #@NoSelf
+        &quot;&quot;&quot;
+        Return the L{txdav.caldav.datastore.scheduling.localservers.Server} for the record's server &quot;pod&quot;.
+
+        @return: a pod server record.
+        @rtype: L{txdav.caldav.datastore.scheduling.localservers.Server}
+        &quot;&quot;&quot;
+
+    def thisServer(): #@NoSelf
+        &quot;&quot;&quot;
+        Indicates whether the record is hosted on this server &quot;pod&quot;.
+
+        @return: C{True} if hosted by this service.
+        @rtype: C{bool}
+        &quot;&quot;&quot;
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavcommoninotificationspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/inotifications.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/inotifications.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/common/inotifications.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavidavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/idav.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/idav.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/idav.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxml__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx"> # See LICENSE for details.
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmlbasepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/base.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/base.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/base.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> # Copyright (c) 2007 Twisted Matrix Laboratories.
</span><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmlelementpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/element.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/element.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/element.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmlextensionspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/extensions.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/extensions.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/extensions.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx"> # See LICENSE for details.
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmlparserpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/parser.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/parser.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/parser.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmlparser_basepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/parser_base.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/parser_base.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/parser_base.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmlparser_etreepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/parser_etree.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/parser_etree.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/parser_etree.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmlparser_saxpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/parser_sax.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/parser_sax.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/parser_sax.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmlrfc2518py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc2518.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc2518.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc2518.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmlrfc3253py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc3253.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc3253.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc3253.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmlrfc3744py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc3744.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc3744.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc3744.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmlrfc4331py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc4331.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc4331.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc4331.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmlrfc5397py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc5397.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc5397.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc5397.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmlrfc5842py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc5842.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc5842.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc5842.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmlrfc5995py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc5995.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc5995.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc5995.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmlrfc6578py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc6578.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc6578.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/rfc6578.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2009-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2009-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmltest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmltesttest_basepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/test/test_base.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/test/test_base.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/test/test_base.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> # Copyright (c) 2009 Twisted Matrix Laboratories.
</span><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmltesttest_xmlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/test/test_xml.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/test/test_xml.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/test/test_xml.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx"> # See LICENSE for details.
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxdavxmltesttest_xml_rfc3744py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/test/test_xml_rfc3744.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/test/test_xml_rfc3744.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txdav/xml/test/test_xml_rfc3744.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx"> 
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2009 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2auth__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2001-2004 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2authbasicpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/basic.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/basic.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/basic.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test.test_httpauth -*-
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2006-2009 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2authdigestpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/digest.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/digest.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/digest.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test.test_httpauth -*-
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2006-2009 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2authinterfacespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/interfaces.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/interfaces.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/interfaces.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2004-2007 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2authwrapperpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/wrapper.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/wrapper.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/auth/wrapper.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test.test_httpauth -*-
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2001-2004 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2channel__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/channel/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/channel/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/channel/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test.test_cgi,twext.web2.test.test_http -*-
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2001-2004 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2channelhttppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/channel/http.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/channel/http.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/channel/http.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test.test_http -*-
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2001-2004 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2008-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2008-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2client__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/client/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/client/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/client/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test.test_client -*-
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2004 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2clienthttppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/client/http.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/client/http.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/client/http.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test.test_client -*-
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2001-2007 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2clientinterfacespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/client/interfaces.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/client/interfaces.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/client/interfaces.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test.test_client -*-
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2007 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2dav__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx"> 
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2009 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davauthpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/auth.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/auth.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/auth.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davfileoppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/fileop.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/fileop.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/fileop.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davhttppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/http.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/http.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/http.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davidavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/idav.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/idav.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/idav.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davmethod__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodaclpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/acl.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/acl.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/acl.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_lock -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodcopymovepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/copymove.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/copymove.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/copymove.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_copy,twext.web2.dav.test.test_move -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davmethoddeletepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/delete.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/delete.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/delete.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_delete -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davmethoddelete_commonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/delete_common.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/delete_common.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/delete_common.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_delete -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodgetpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/get.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/get.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/get.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_lock -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodlockpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/lock.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/lock.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/lock.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_lock -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodmkcolpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/mkcol.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/mkcol.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/mkcol.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_mkcol -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodpropfindpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/propfind.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/propfind.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/propfind.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_prop.PROP.test_PROPFIND -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodproppatchpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/proppatch.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/proppatch.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/proppatch.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_prop.PROP.test_PROPPATCH -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodputpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/put.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/put.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/put.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_put -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodput_commonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/put_common.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/put_common.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/put_common.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodreportpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_report -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodreport_acl_principal_prop_setpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_acl_principal_prop_set.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_acl_principal_prop_set.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_acl_principal_prop_set.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_report_expand -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodreport_expandpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_expand.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_expand.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_expand.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_report_expand -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodreport_principal_matchpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_principal_match.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_principal_match.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_principal_match.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_report_expand -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodreport_principal_property_searchpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_principal_property_search.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_principal_property_search.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_principal_property_search.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_report_expand -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davmethodreport_principal_search_property_setpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_principal_search_property_set.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_principal_search_property_set.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/method/report_principal_search_property_set.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_report_expand -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2006-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2006-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davnonepropspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/noneprops.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/noneprops.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/noneprops.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/resource.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/resource.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/resource.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_resource -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davstaticpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/static.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/static.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/static.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.dav.test.test_static -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtest__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/__init__.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/__init__.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/__init__.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_aclpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_acl.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_acl.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_acl.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_authpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_auth.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_auth.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_auth.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2012-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2012-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_copypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_copy.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_copy.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_copy.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_deletepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_delete.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_delete.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_delete.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_httppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_http.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_http.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_http.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_lockpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_lock.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_lock.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_lock.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_mkcolpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_mkcol.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_mkcol.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_mkcol.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_movepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_move.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_move.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_move.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_optionspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_options.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_options.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_options.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_pipelinepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_pipeline.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_pipeline.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_pipeline.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_proppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_prop.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_prop.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_prop.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_putpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_put.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_put.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_put.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_quotapy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_quota.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_quota.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_quota.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_reportpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_report.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_report.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_report.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_report_expandpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_report_expand.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_report_expand.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_report_expand.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_resourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_resource.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_resource.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_resource.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_staticpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_static.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_static.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_static.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtesttest_utilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/test_util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davtestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/test/util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/util.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/util.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/util.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test.test_util -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2davxattrpropspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/xattrprops.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/xattrprops.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/dav/xattrprops.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx"> # See LICENSE for details.
</span><span class="cx"> 
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2005-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2errorpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/error.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/error.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/error.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test.test_log -*-
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2001-2004 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2fileuploadpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/fileupload.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/fileupload.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/fileupload.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2001-2004 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2httppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/http.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/http.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/http.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test.test_http -*-
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2001-2004 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span><span class="lines">@@ -558,7 +558,7 @@
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     def __init__(self, code, jobj):
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        @param xml_responses: an iterable of davxml.Response objects.
</del><ins>+        @param jobj: a Python object that can be serialized to JSON.
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Response.__init__(self, code, stream=json.dumps(jobj))
</span><span class="cx">         self.headers.setHeader(&quot;content-type&quot;, http_headers.MimeType(&quot;application&quot;, &quot;json&quot;))
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2http_headerspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/http_headers.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/http_headers.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/http_headers.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test.test_http_headers -*-
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2008 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2iwebpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/iweb.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/iweb.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/iweb.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test -*-
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2001-2008 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2logpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/log.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/log.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/log.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test.test_log -*-
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2001-2004 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2metafdpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/metafd.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/metafd.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/metafd.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test.test_metafd -*-
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2resourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/resource.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/resource.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/resource.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test.test_server,twext.web2.test.test_resource -*-
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2001-2007 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2responsecodepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/responsecode.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/responsecode.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/responsecode.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test -*-
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2001-2004 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2serverpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/server.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/server.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/server.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test.test_server -*-
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2001-2008 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2staticpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/static.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/static.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/static.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test.test_static -*-
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2001-2008 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2streampy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/stream.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/stream.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/stream.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> # -*- test-case-name: txweb2.test.test_stream -*-
</span><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2001-2007 Twisted Matrix Laboratories.
</span><del>-# Copyright (c) 2010-2013 Apple Computer, Inc. All rights reserved.
</del><ins>+# Copyright (c) 2010-2014 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class="cx"> # of this software and associated documentation files (the &quot;Software&quot;), to deal
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayacleanrevisionstxweb2testtest_metafdpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/cleanrevisions/txweb2/test/test_metafd.py (12321 => 12322)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/cleanrevisions/txweb2/test/test_metafd.py        2014-01-12 03:19:13 UTC (rev 12321)
+++ CalendarServer/branches/users/gaya/cleanrevisions/txweb2/test/test_metafd.py        2014-01-12 19:10:08 UTC (rev 12322)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> ##
</span><del>-# Copyright (c) 2011-2013 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="cx"> # you may not use this file except in compliance with the License.
</span></span></pre>
</div>
</div>

</body>
</html>