<feed xmlns='http://www.w3.org/2005/Atom'>
<title>mailman.git/bin/withlist, branch master</title>
<subtitle>The GNU Mailing List manager.</subtitle>
<id>https://git.neuromancer.sk/mailman.git/atom/bin/withlist?h=master</id>
<link rel='self' href='https://git.neuromancer.sk/mailman.git/atom/bin/withlist?h=master'/>
<link rel='alternate' type='text/html' href='https://git.neuromancer.sk/mailman.git/'/>
<updated>2006-12-29T22:20:25Z</updated>
<entry>
<title>Merged revisions 8113-8121 via svnmerge from </title>
<updated>2006-12-29T22:20:25Z</updated>
<author>
<name>bwarsaw</name>
</author>
<published>2006-12-29T22:20:25Z</published>
<link rel='alternate' type='text/html' href='https://git.neuromancer.sk/mailman.git/commit/?id=f4a456a83b630feb294724ab462c87ca1ce1c3ae'/>
<id>urn:sha1:f4a456a83b630feb294724ab462c87ca1ce1c3ae</id>
<content type='text'>
https://mailman.svn.sourceforge.net/svnroot/mailman/branches/tmp-sqlalchemy-branch

................
  r8114 | bwarsaw | 2006-12-06 00:16:54 -0500 (Wed, 06 Dec 2006) | 44 lines
  
  Initial take on using SQLAlchemy to store list data in lieu of Python pickles.
  While all the list data (including OldStyleMemberships attributes) are stored
  in the database, many attributes are stored as PickleTypes binary data.  This
  isn't idea but it gets things working until a more sophisticated schema can be
  developed.
  
  MailList class is now a new-style class, as is required by SQLAlchemy.  This
  makes several things, er, interesting.  Rip out all the low-level pickle
  reading and writing stuff.  Hook SA transaction events into Lock() and
  Unlock().  Move the hooking of the _memberadaptor into InitTempVars(), which
  gets called by the SQLAlchemy hooks (MailList.__init__() never is).
  
  Add an initialize.py module which centralizes all the initialization bits that
  command line scripts have to do, including configuration, logging, and atabase
  initialization.
  
  This change also converts bin/withlist to mmshell wrapper.
  
  Update to SQLAlchemy 0.3.1.
  
  Revamp paths.py.in considerably.  There were several problems with the old
  way.  We no longer disable default loading of site-packages so we don't need
  to add Python's site-packages back to sys.path.  Also, because
  site.addsitedir() causes things like .pth paths to be /appended/ to sys.path,
  they actually won't override any site-installed packages.  E.g. if SQLAlchemy
  is installed in the system Python, our version will not override.  IIUC,
  setuptools-based packages can be configured to work properly in the face of
  package versions, however not all packages we currently depend on are
  setuptools-based.  So instead, we steal a bit of stuff from site.py but change
  things so the prepend .pth stuff to sys.path.
  
  Update several modules to use True/False and whitespace normalization.
  Convert from mm_cfg to config object.  Modernize a few coding constructs.
  
  Add a couple of exceptions to handle database problems.
  
  In the export script, include the widget type in the elements.  This helped in
  my stupid little throw away conversion script, but I think it will be more
  generally useful.
  
  Add an interact.py module which refactors interactive interpreter access.
  Mostly this is used by withlist -i, but it lets us import Mailman.interact and
  drop into a prompt just about anywhere (e.g. debugging).
................
  r8115 | bwarsaw | 2006-12-07 09:13:56 -0500 (Thu, 07 Dec 2006) | 22 lines
  
  Start to flesh out more of the SQLAlchemy mechanisms.
  
  Added a MailList.__new__() which hooks instantiation to use a query on
  dbcontext to get an existing mailing list.  A 'no-args' call means we're doing
  a Create(), though eventually that will change too.
  
  For now, disable the CheckVersion() call.  Eventually this will be folded into
  schema migration.
  
  list_exists(): Rewrite to use the dbcontext query to determine if the named
  mailing list exists or not.  Requires the fqdn_listname.
  
  Eradicate two failed member adaptors: BDBMemberAdaptor and SAMemberships.
  
  Change the way the DBContext holds onto tables.  It now keeps a dictionary
  mapping the table's name to the SA Table instance.  This makes it easier to
  look up and use the individual tables.
  
  Add 'web_page_url' as an attribute managed by SA, and remove a debugging
  print.
................
  r8116 | bwarsaw | 2006-12-11 07:27:47 -0500 (Mon, 11 Dec 2006) | 29 lines
  
  Rework the whole dbcontext and transaction framework.  SA already handles
  nested transactions so we don't have to worry about them.  However, we do have
  the weird situation where some transactions are tied to MailList
  .Lock()/.Unlock()/.Save() and some are tied to non-mlist actions.  So now we
  use an @txn decorator to put methods in a session transaction, but then we
  also hook into the above MailList methods as possibly sub-transactions.  We
  use a weakref subclass to manage the MailList interface, with a dictionary
  mapping MailList fqdn_listnames against transactions.  The weakrefs come in by
  giving us a callback when a MailList gets derefed such that we're guaranteed
  to rollback any outstanding transaction.
  
  Also, we have one global DBContext instance but rather than force the rest of
  Mailman to deal with context objects, instead we expose API methods on that
  object into the Mailman.database module, which the rest of the code will use.
  Such methods must be prepended with 'api_' to get exposed this way.
  
  bin/rmlist now works with the SA-backend.  I refactored the code here so that
  other code (namely, the test suite) can more easily and consistently remove a
  mailing list.  This isn't the best place for it ultimately, but it's good
  enough for now.
  
  New convenience functions Utils.split_listname(), .fqdn_listname().
  
  Convert testall to use Mailman.initialize.initialize().  Not all tests work,
  but I'm down to only 8 failures and 7 errors.  Also, do a better job of
  recovering from failures in setUp().
  
  MailList.__new__() now takes keyword arguments.
................
  r8117 | bwarsaw | 2006-12-11 22:58:06 -0500 (Mon, 11 Dec 2006) | 7 lines
  
  Unit test repairs; even though the unit tests are still pretty fragile,
  everything now passes with the SQLAlchemy storage of list data.
  
  Added missing 'personalize' column.  Converted mailmanctl and qrunner to
  initialize() interface.  Fixed _cookie_path() to not fail if SCRIPT_NAME is
  not in the environment.
................
  r8118 | bwarsaw | 2006-12-27 18:45:41 -0500 (Wed, 27 Dec 2006) | 21 lines
  
  Utils.list_names(): Use a database query to get all the list names.
  
  dbcontext.py: Added api_get_list_names() to support Utils.list_names().
  
  listdata.py: Added two additional MailList attributes which need to be stored
  in the database.  The first is 'admin_member_chunksize' which isn't modifiable
  from the web.  The second is 'password' which holds the list's password.
  
  HTMLFormatObject: item strings can now be unicodes.
  
  bin/list_lists.py: Must call initialize() to get the database properly
  initialized, not just config.load().  This will be a common theme.
  
  SecurityManager.py:
      - Remove md5 and crypt support
      - Added mailman.debug logger, though it will be only used during
        debugging.
      - The 'secret' can be a unicode now.
      - A few coding style updates; repr() instead of backticks, 'key in dict'
        instead of 'dict.has_key(key)'
................
  r8119 | bwarsaw | 2006-12-27 19:13:09 -0500 (Wed, 27 Dec 2006) | 2 lines
  
  genaliases.py: config.load() -&gt; initialize()
................
  r8120 | bwarsaw | 2006-12-27 19:17:26 -0500 (Wed, 27 Dec 2006) | 9 lines
  
  Blocked revisions 8113 via svnmerge
  
  ........
    r8113 | bwarsaw | 2006-12-05 23:54:30 -0500 (Tue, 05 Dec 2006) | 3 lines
    
    Initialized merge tracking via "svnmerge" with revisions "1-8112" from 
    https://mailman.svn.sourceforge.net/svnroot/mailman/branches/tmp-sqlalchemy-branch
  ........
................
  r8121 | bwarsaw | 2006-12-28 23:34:52 -0500 (Thu, 28 Dec 2006) | 20 lines
  
  Remove SIGTERM handling from all the CGI scripts.  This messes with HTTPRunner
  because when you issue "mailmanctl stop" after the signal handler has been
  installed, the process will get a SIGTERM, the signal handler will run, and
  the process will exit with a normal zero code.  This will cause mailmanctl to
  try to restart the HTTPRunner.
  
  I don't think we need that stuff at all when running under wsgi with a
  SQLAlchemy backend.  If mailmanctl kills the HTTPRunner in the middle of the
  process, I believe (but have not tested) that the transaction should get
  properly rolled back at process exit.  We need to make sure about this, and
  also we need to test the signal handling functionality under traditional CGI
  environment (if we even still want to support that).
  
  Also, make sure that we don't try to initialize the loggers twice in qrunner.
  This was the cause of all the double entries in logs/qrunner.
  
  Fix a coding style nit in mailmanctl.py.
  
  De-DOS-ify line endings in loginit.py.
................
</content>
</entry>
<entry>
<title>Convert genaliases to mmshell, optparse, and configuration.config</title>
<updated>2006-09-25T00:01:06Z</updated>
<author>
<name>bwarsaw</name>
</author>
<published>2006-09-25T00:01:06Z</published>
<link rel='alternate' type='text/html' href='https://git.neuromancer.sk/mailman.git/commit/?id=8157935353a960cd03a72e403e8638b016c8e9a1'/>
<id>urn:sha1:8157935353a960cd03a72e403e8638b016c8e9a1</id>
<content type='text'>
bin/withlist: If there's no '@' in the listname, append the DEFAULT_EMAIL_HOST
so we always get a fully qualified list name.

bin/mmsitepass: plumb through -C/--config switch and be sure to call
config.load().

Convert Mailman/MTA/Postfix.py to configuration.config, and update MTA/Manual.

In mailman/Cgi/create, we can't convert straight from a string to a bool,
because bool('0') is True.  We need to go through int first.

MailList.InitTempVars(): The logic here looked weird because we could get
'name' = None and that would break.  Assume name is never None.
</content>
</entry>
<entry>
<title>First crack at real virtual domain support, i.e. mailing lists with the same</title>
<updated>2006-07-08T17:58:13Z</updated>
<author>
<name>bwarsaw</name>
</author>
<published>2006-07-08T17:58:13Z</published>
<link rel='alternate' type='text/html' href='https://git.neuromancer.sk/mailman.git/commit/?id=f321ff8f419284c32f7eea4e06c83212bccef6b0'/>
<id>urn:sha1:f321ff8f419284c32f7eea4e06c83212bccef6b0</id>
<content type='text'>
name in more than one domain.

- Totally eradicate MAILMAN_SITE_LIST, and in fact the entire need for a site
  list.  The functions that the site list previously performed are either
  removed or supported in other ways.  For example, instead of forwarding
  owner bounces to the site list, we now have a SITE_OWNER_ADDRESS which
  should point to a human, and such bounces are sent there instead.  There's
  also a "no reply" email address that should be set up to go to devnull.  For
  any message that never expects a reply, the sender is set to this address.

- Remove the Site.py module.  It was an experimental approach to trying to
  support virtual domains, and we're going to do it so much better now that
  this module is no longer necessary.  Site._makedirs() -&gt; Utils.makedir().

- VIRTUAL_HOST_OVERVIEW is completely removed, since now virtual hosts are
  always enabled.  Virtual domains should be added to mailman.cfg by using the
  new add_domain() function.  add_virtualhost() is gone.  If no virtual
  domains are added explicitly, we add the default one that configure guessed
  (but we never add that if domains are added explicitly).

- Utils.get_domain() -&gt; Utils.get_request_domain()

- withlist code cleanup and make sure that we load etc/mailman.cfg

- A new base exception called MailmanException is added, from which all
  exceptions defined in Errors.py ultimately derive.  MailmanError is retained
  and derives from MailmanException.

- BadDomainSpecificationError is added.

- Remove the -V/--virtual-host-overview option from list_lists and add instead
  -d/--domain and -f/--full.

- bin/update probably works but needs more testing.

- bin/newlist and bin/rmlist take fqdn list names, but default to the default
  domain if @whatever isn't given.  newlist's -u/--urlhost and -e/--emailhost
  options are removed.  The domain that the list is being added to must
  already exist.

- Minor code cleanup in Message.py

- Bump version to 2.2.0a1

- The Configuration object grows a .domain dictionary which maps email hosts
  to url hosts.  The reverse mapping is supported, but not directly; use
  Configuration.get_email_host() instead.

- Mailman/Cgi/create is converted from mm_cfg to config, and some minor code
  cleanup is performed.  Also, convert to __i18n_templates__ = True.

- New MailList APIs:
  + property .fqdn_listname
  + GetNoReplyEmail()
  + Create() API changes and refactoring.
</content>
</entry>
<entry>
<title>Added a call to loginit.initialize() so invoked modules can do their logging.</title>
<updated>2006-06-11T01:41:58Z</updated>
<author>
<name>msapiro</name>
</author>
<published>2006-06-11T01:41:58Z</published>
<link rel='alternate' type='text/html' href='https://git.neuromancer.sk/mailman.git/commit/?id=df4b8b2543a49593bf972f37e66746107cb089de'/>
<id>urn:sha1:df4b8b2543a49593bf972f37e66746107cb089de</id>
<content type='text'>
</content>
</entry>
<entry>
<title>back port from 2.1.6 / adding new files.</title>
<updated>2005-08-28T05:41:46Z</updated>
<author>
<name>tkikuchi</name>
</author>
<published>2005-08-28T05:41:46Z</published>
<link rel='alternate' type='text/html' href='https://git.neuromancer.sk/mailman.git/commit/?id=1c0c9a0ce8d100157e4c1a21e7e0f8bddc990f50'/>
<id>urn:sha1:1c0c9a0ce8d100157e4c1a21e7e0f8bddc990f50</id>
<content type='text'>
</content>
</entry>
<entry>
<title>FSF office has moved. chdcking in for MAIN branch.</title>
<updated>2005-08-27T01:54:05Z</updated>
<author>
<name>tkikuchi</name>
</author>
<published>2005-08-27T01:54:05Z</published>
<link rel='alternate' type='text/html' href='https://git.neuromancer.sk/mailman.git/commit/?id=2a6084d03b96f87af153b663cf3dd4776e7e37fb'/>
<id>urn:sha1:2a6084d03b96f87af153b663cf3dd4776e7e37fb</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Fixed exception name typo in docstring example.</title>
<updated>2003-04-17T03:52:08Z</updated>
<author>
<name>bwarsaw</name>
</author>
<published>2003-04-17T03:52:08Z</published>
<link rel='alternate' type='text/html' href='https://git.neuromancer.sk/mailman.git/commit/?id=b92fdfa32e8634d4df59e53bab84b0ebdf4bc2a4'/>
<id>urn:sha1:b92fdfa32e8634d4df59e53bab84b0ebdf4bc2a4</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Jon Parise's patch to improve the usage() output for the command line</title>
<updated>2002-10-21T22:36:58Z</updated>
<author>
<name>bwarsaw</name>
</author>
<published>2002-10-21T22:36:58Z</published>
<link rel='alternate' type='text/html' href='https://git.neuromancer.sk/mailman.git/commit/?id=17da8273eb61687e1eb7c1e068613036fc1f3f46'/>
<id>urn:sha1:17da8273eb61687e1eb7c1e068613036fc1f3f46</id>
<content type='text'>
and cron scripts.  When code/status == 0, there's no error (it's
likely --help output) so send that to stdout.  Otherwise, it's an
error and the output goes to stderr.
</content>
</entry>
<entry>
<title>-i is now optional unless the -r option is given.  IOW, we always drop</title>
<updated>2002-03-14T23:42:20Z</updated>
<author>
<name>bwarsaw</name>
</author>
<published>2002-03-14T23:42:20Z</published>
<link rel='alternate' type='text/html' href='https://git.neuromancer.sk/mailman.git/commit/?id=6034f6891bb0b925da9c63709c548318366f8a60'/>
<id>urn:sha1:6034f6891bb0b925da9c63709c548318366f8a60</id>
<content type='text'>
into interactive mode unless we --run.
</content>
</entry>
<entry>
<title>Restore Ken M's favorite feature &lt;wink&gt;.</title>
<updated>2002-01-29T19:10:48Z</updated>
<author>
<name>bwarsaw</name>
</author>
<published>2002-01-29T19:10:48Z</published>
<link rel='alternate' type='text/html' href='https://git.neuromancer.sk/mailman.git/commit/?id=4d88fbed1473c8c51c8086d4636e7b46b0edda1b'/>
<id>urn:sha1:4d88fbed1473c8c51c8086d4636e7b46b0edda1b</id>
<content type='text'>
Added a --all / -a flag which says to run the callable against every
list in the system.  Must be used w/ -r / --run.
</content>
</entry>
</feed>
