[X2Go-Commits] python-x2go.git - build-baikal (branch) updated: 0.1.1.4-257-g0042fba
X2Go dev team
git-admin at x2go.org
Wed Jan 8 15:27:05 CET 2014
The branch, build-baikal has been updated
via 0042fba6522012ee12af9d8962e707a70db16ed9 (commit)
from d4ec52b42c35c39ef19a7f73d4ab48529cee219f (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
-----------------------------------------------------------------------
Summary of changes:
x2go/backends/info/_stdout.py | 63 +++++++++++-
x2go/backends/printing/_file.py | 38 +++++++-
x2go/backends/profiles/_file.py | 168 ++++++++++++++++++++++++++++----
x2go/backends/profiles/_gconf.py | 13 ++-
x2go/backends/profiles/_httpsbroker.py | 13 ++-
x2go/backends/profiles/_winreg.py | 13 ++-
x2go/inifiles.py | 6 +-
x2go/mimebox.py | 5 +
x2go/printqueue.py | 3 +
9 files changed, 290 insertions(+), 32 deletions(-)
The diff of changes is:
diff --git a/x2go/backends/info/_stdout.py b/x2go/backends/info/_stdout.py
index 9f34976..7182a95 100644
--- a/x2go/backends/info/_stdout.py
+++ b/x2go/backends/info/_stdout.py
@@ -54,6 +54,9 @@ class X2goServerSessionInfoSTDOUT(object):
"""\
Parse a single line of X2go's listsessions output.
+ @param x2go_output: output from ,,x2golistsessions'' command (as list of strings/lines)
+ @type x2go_output: C{list}
+
"""
try:
l = x2go_output.split("|")
@@ -80,19 +83,43 @@ class X2goServerSessionInfoSTDOUT(object):
raise e
def is_published_applications_provider(self):
+ """\
+ Detect from session info if this session is a published applications provider.
+ @return: returns C{True} if this session is a published applications provider
+ @rtype: C{bool}
+
+ """
return re.match('.*_stRPUBLISHED_.*', self.name)
def is_running(self):
+ """\
+ Is this session running?
+
+ @return: C{True} if the session is running, C{False} otherwise
+ @rtype: C{bool}
+ """
return self.status == 'R'
def is_suspended(self):
+ """\
+ Is this session suspended?
+ @return: C{True} if the session is suspended, C{False} otherwise
+ @rtype: C{bool}
+
+ """
return self.status == 'S'
def is_desktop_session(self):
+ """\
+ Is this session a desktop session?
+
+ @return: C{True} if this session is a desktop session, C{False} otherwise
+ @rtype: C{bool}
+ """
_desktop_sessions = defaults.X2GO_DESKTOPSESSIONS.keys()
_regexp_desktop_sessions = '(%s)' % "|".join(_desktop_sessions)
return re.match('.*_stD%s_.*' % _regexp_desktop_sessions, self.name)
@@ -101,6 +128,9 @@ class X2goServerSessionInfoSTDOUT(object):
"""\
Parse x2gostartagent output.
+ @param x2go_output: output from ,,x2gostartagent'' command (as list of strings/lines)
+ @type x2go_output: C{list}
+
"""
try:
l = x2go_output.split("\n")
@@ -130,7 +160,7 @@ class X2goServerSessionInfoSTDOUT(object):
def initialize(self, x2go_output, username='', hostname='', local_container='', remote_container=''):
"""\
- Parse X2Go server's C{x2gostartagent} stdout values.
+ Setup a a session info data block, includes parsing of X2Go server's C{x2gostartagent} stdout values.
@param x2go_output: X2Go server's C{x2gostartagent} command output, each value
separated by a newline character.
@@ -153,15 +183,33 @@ class X2goServerSessionInfoSTDOUT(object):
self.remote_container = remote_container
def protect(self):
+ """\
+ Write-protect this session info data structure.
+
+ """
self.protected = True
def unprotect(self):
+ """\
+ Remove write-protection from this session info data structure.
+
+ """
self.protected = False
def is_protected(self):
+ """\
+
+ """
return self.protected
def get_status(self):
+ """\
+ Retrieve the session's status from this session info data structure.
+
+ @return: session status
+ @rtype: C{str}
+
+ """
return self.status
def clear(self):
@@ -189,6 +237,9 @@ class X2goServerSessionInfoSTDOUT(object):
"""\
Update all properties of a L{X2goServerSessionInfo} object.
+ @param session_info: a provided session info data structure
+ @type session_info: C{X2goServerSessionInfo*}
+
"""
if type(session_info) == type(self):
for prop in ('graphics_port', 'snd_port', 'sshfs_port', 'date_suspended', 'status', ):
@@ -215,6 +266,8 @@ class X2goServerSessionListSTDOUT(object):
session separated by a newline character. Session values are separated
by Unix Pipe Symbols ('|')
@type x2go_output: str
+ @param info_backend: the session info backend to use
+ @type info_backend: C{X2goServerSessionInfo*}
"""
self.sessions = {}
@@ -231,7 +284,13 @@ class X2goServerSessionListSTDOUT(object):
def get_session_info(self, session_name):
"""\
- STILL UNDOCUMENTED
+ Retrieve the session information for C{<session_name>}.
+
+ @param session_name: the queried session name
+ @type session_name: C{str}
+
+ @return: the session info of C{<session_name>}
+ @rtype: C{X2goServerSessionInfo*} or C{None}
"""
try:
diff --git a/x2go/backends/printing/_file.py b/x2go/backends/printing/_file.py
index 7be1199..372624c 100644
--- a/x2go/backends/printing/_file.py
+++ b/x2go/backends/printing/_file.py
@@ -141,6 +141,16 @@ class X2goClientPrintingFILE(inifiles.X2goIniFile):
"""\
Return the print action described by the »printing« configuration file.
+ @param reload: reload the configuration file before retrieving the print action?
+ @type reload: C{bool}
+ @param reinit: re-detect the print action from what is stored in cache?
+ @type reinit: C{bool}
+ @param return_name: return the print action name, not the class
+ @type return_name: C{bool}
+
+ @return: the configured print action
+ @rtype: C{obj} or C{str}
+
"""
if reload:
self.load()
@@ -155,7 +165,15 @@ class X2goClientPrintingFILE(inifiles.X2goIniFile):
def get_property(self, print_property):
"""\
- STILL UNDOCUMENTED
+ Retrieve a printing property as mapped by the L{_print_property_map} dictionary.
+
+ @param print_property: a printing property
+ @type print_property: C{str}
+
+ @return: the stored value for C{<print_property>}
+ @rtype: C{str}
+
+ @raise X2goClientPrintingException: if the printing property does not exist
"""
if print_property in _print_property_map.keys():
@@ -167,7 +185,14 @@ class X2goClientPrintingFILE(inifiles.X2goIniFile):
def set_property(self, print_property, value):
"""\
- STILL UNDOCUMENTED
+ Set a printing property as mapped by the L{_print_property_map} dictionary.
+
+ @param print_property: a printing property
+ @type print_property: C{str}
+ @param value: the value to be stored as C{<print_property>}
+ @rtype: C{str}
+
+ @raise X2goClientPrintingException: if the printing property does not exist or if there is a type mismatch
"""
if print_property in _print_property_map.keys():
@@ -184,7 +209,14 @@ class X2goClientPrintingFILE(inifiles.X2goIniFile):
def store_print_action(self, print_action, **print_properties):
"""\
- STILL UNDOCUMENTED
+ Accept a new print action configuration. This includes the print action
+ itself (DIALOG, PDFVIEW, PDFSAVE, PRINT or PRINTCMD) and related printing properties
+ as mapped by the L{_print_property_map} dictionary.
+
+ @param print_action: the print action name
+ @type print_action: C{str}
+ @param print_properties: the printing properties to set for the given print action
+ @type print_properties: C{dict}
"""
if print_action == 'DIALOG':
diff --git a/x2go/backends/profiles/_file.py b/x2go/backends/profiles/_file.py
index 4ebe6c8..0edd84b 100644
--- a/x2go/backends/profiles/_file.py
+++ b/x2go/backends/profiles/_file.py
@@ -47,7 +47,20 @@ class X2goSessionProfilesFILE(inifiles.X2goIniFile):
def __init__(self, config_files=_X2GO_SESSIONPROFILES_CONFIGFILES, defaults=None, session_profile_defaults=None, logger=None, loglevel=log.loglevel_DEFAULT):
"""\
- STILL UNDOCUMENTED
+ Retrieve X2Go session profiles from a file, typically C{~/.x2goclient/sessions}.
+
+ @param config_files: a list of config file locations, the first file name in this list the user has write access to will be the user configuration file
+ @type config_files: C{list}
+ @param defaults: not used for this class
+ @type defaults: C{dict}
+ @param session_profile_defaults: a default session profile
+ @type session_profile_defaults: C{dict}
+ @param logger: you can pass an L{X2goLogger} object to the
+ L{X2goSessionProfilesFILE} constructor
+ @type logger: L{X2goLogger} instance
+ @param loglevel: if no L{X2goLogger} object has been supplied a new one will be
+ constructed with the given loglevel
+ @type loglevel: C{int}
"""
self.defaultValues = {}
@@ -77,13 +90,31 @@ class X2goSessionProfilesFILE(inifiles.X2goIniFile):
def __call__(self, profile_id_or_name):
"""\
- STILL UNDOCUMENTED
+ Retrieve the session profile configuration for a given session profile ID (or name)
+
+ @param profile_id_or_name: profile ID or profile name
+ @type profile_id_or_name: C{str}
+
+ @return: the profile ID's / name's profile configuration
+ @rtype: C{dict}
"""
_profile_id = self.check_profile_id_or_name(self, profile_id_or_name)
return self.get_profile_config(profile_id=_profile_id)
def get_profile_metatype(self, profile_id_or_name, force=False):
+ """\
+ Detect a human readable session profile type from the session profile configuration.
+
+ @param profile_id_or_name: profile ID or profile name
+ @type profile_id_or_name: C{str}
+ @param force: re-detect the meta type, otherwise use a cached result
+ @type force: C{bool}
+
+ @return: the profile ID's / name's meta type
+ @rtype: C{str}
+
+ """
_profile_id = self.check_profile_id_or_name(profile_id_or_name)
if not self._profile_metatypes.has_key(_profile_id) or force:
@@ -117,7 +148,13 @@ class X2goSessionProfilesFILE(inifiles.X2goIniFile):
def get_profile_option_type(self, option):
"""\
- STILL UNDOCUMENTED
+ Get the data type for a specific session profile option.
+
+ @param option: the option to get the data type for
+ @type option: will be detected by this method
+
+ @return: the data type of C{option}
+ @rtype: C{type}
"""
try:
@@ -127,7 +164,15 @@ class X2goSessionProfilesFILE(inifiles.X2goIniFile):
def get_type(self, section, key):
"""\
- STILL UNDOCUMENTED
+ Override the parent class's get_type method due to the special layout of this class.
+
+ @param section: INI file section
+ @type section: C{str}
+ @param key: key in INI file section
+ @type key: C{str}
+
+ @return: the data type of C{key} in C{section}
+ @rtype: C{type}
"""
# we have to handle the get_type method separately...
@@ -135,7 +180,15 @@ class X2goSessionProfilesFILE(inifiles.X2goIniFile):
def get_profile_config(self, profile_id_or_name=None, profile_id=None):
"""\
- STILL UNDOCUMENTED
+ The configuration options for a single session profile.
+
+ @param profile_id_or_name: either profile ID or profile name is accepted
+ @type profile_id_or_name: C{str}
+ @param profile_id: profile ID (fast than specifying C{profile_id_or_name})
+ @type profile_id: C{str}
+
+ @return: the session profile configuration for the given profile ID (or name)
+ @rtype: C{dict}
"""
_profile_id = profile_id or self.check_profile_id_or_name(profile_id_or_name)
@@ -146,12 +199,25 @@ class X2goSessionProfilesFILE(inifiles.X2goIniFile):
def default_profile_config(self):
"""\
- STILL UNDOCUMENTED
+ Return a default session profile.
+
+ @return: default session profile
+ @rtype: C{dict}
"""
return copy.deepcopy(self.defaultSessionProfile)
def has_profile(self, profile_id_or_name):
+ """\
+ Does a session profile of a given profile ID or profile name exist?
+
+ @param profile_id_or_name: profile ID or profile name
+ @type profile_id_or_name: C{str}
+
+ @return: C{True} if there is such a session profile, C{False} otherwise
+ @rtype: C{bool}
+
+ """
try:
self.check_profile_id_or_name(profile_id_or_name)
return True
@@ -161,7 +227,7 @@ class X2goSessionProfilesFILE(inifiles.X2goIniFile):
@property
def profile_ids(self):
"""\
- STILL UNDOCUMENTED
+ Renders a list of all profile IDs found in the session profile configuration file.
"""
if not self._cached_profile_ids:
@@ -170,7 +236,13 @@ class X2goSessionProfilesFILE(inifiles.X2goIniFile):
def has_profile_id(self, profile_id):
"""\
- STILL UNDOCUMENTED
+ Does a session profile of a given profile ID exist? (Faster than L{has_profile()}.)
+
+ @param profile_id: profile ID
+ @type profile_id: C{str}
+
+ @return: C{True} if there is such a session profile, C{False} otherwise
+ @rtype: C{bool}
"""
return profile_id in self.profile_ids
@@ -178,7 +250,7 @@ class X2goSessionProfilesFILE(inifiles.X2goIniFile):
@property
def profile_names(self):
"""\
- STILL UNDOCUMENTED
+ Renders a list of all profile names found in the session profile configuration file.
"""
if not self._cached_profile_names:
@@ -187,14 +259,26 @@ class X2goSessionProfilesFILE(inifiles.X2goIniFile):
def has_profile_name(self, profile_name):
"""\
- STILL UNDOCUMENTED
+ Does a session profile of a given profile name exist? (Faster than L{has_profile()}.)
+
+ @param profile_name: profile name
+ @type profile_name: C{str}
+
+ @return: C{True} if there is such a session profile, C{False} otherwise
+ @rtype: C{bool}
"""
return profile_name in self.profile_names
def to_profile_id(self, profile_name):
"""\
- STILL UNDOCUMENTED
+ Convert profile name to profile ID.
+
+ @param profile_name: profile name
+ @type profile_name: C{str}
+
+ @return: profile ID
+ @rtype: C{str}
"""
_profile_ids = [ p for p in self.profile_ids if self.to_profile_name(p) == profile_name ]
@@ -207,7 +291,13 @@ class X2goSessionProfilesFILE(inifiles.X2goIniFile):
def to_profile_name(self, profile_id):
"""\
- STILL UNDOCUMENTED
+ Convert profile ID to profile name.
+
+ @param profile_id: profile ID
+ @type profile_id: C{str}
+
+ @return: profile name
+ @rtype: C{str}
"""
_profile_config = self.get_profile_config(profile_id=profile_id)
@@ -218,7 +308,15 @@ class X2goSessionProfilesFILE(inifiles.X2goIniFile):
def add_profile(self, profile_id=None, **kwargs):
"""\
- STILL UNDOCUMENTED
+ Add a new session profile.
+
+ @param profile_id: a custom profile ID--if left empty a profile ID will be auto-generated
+ @type profile_id: C{str}
+ @param kwargs: session profile options for this new session profile
+ @type kwargs: C{dict}
+
+ @return: the (auto-generated) profile ID of the new session profile
+ @rtype: C{str}
"""
if profile_id is None:
@@ -240,7 +338,10 @@ class X2goSessionProfilesFILE(inifiles.X2goIniFile):
def delete_profile(self, profile_id_or_name):
"""\
- STILL UNDOCUMENTED
+ Delete a session profile from the configuration file.
+
+ @param profile_id_or_name: profile ID or profile name
+ @type profile_id_or_name: C{str}
"""
_profile_id = self.check_profile_id_or_name(profile_id_or_name)
@@ -252,7 +353,14 @@ class X2goSessionProfilesFILE(inifiles.X2goIniFile):
def update_value(self, section, key, value):
"""\
- STILL UNDOCUMENTED
+ Update a value in a session profile.
+
+ @param section: the profile ID
+ @type section: C{str}
+ @param key: the session profile option of the given profile ID
+ @type key: C{str}
+ @param value: the value to update the session profile option with
+ @type value: any type, depends on the session profile option
"""
profile_id = section
@@ -269,7 +377,15 @@ class X2goSessionProfilesFILE(inifiles.X2goIniFile):
def check_profile_id_or_name(self, profile_id_or_name):
"""\
- STILL UNDOCUMENTED
+ Detect the profile ID from a given string which maybe profile ID or profile name.
+
+ @param profile_id_or_name: profile ID or profile name
+ @type profile_id_or_name: C{str}
+
+ @return: profile ID
+ @rtype: C{str}
+
+ @raise X2goProfileException: if no such session profile exists
"""
_profile_id = None
@@ -285,7 +401,15 @@ class X2goSessionProfilesFILE(inifiles.X2goIniFile):
def to_session_params(self, profile_id_or_name=None, profile_id=None):
"""\
- STILL UNDOCUMENTED
+ Convert session profile options to L{X2goSession} constructor method parameters.
+
+ @param profile_id_or_name: either profile ID or profile name is accepted
+ @type profile_id_or_name: C{str}
+ @param profile_id: profile ID (fast than specifying C{profile_id_or_name})
+ @type profile_id: C{str}
+
+ @return: a dictionary of L{X2goSession} constructor method parameters
+ @rtype: C{dict}
"""
_profile_id = profile_id or self.check_profile_id_or_name(profile_id_or_name)
@@ -293,7 +417,15 @@ class X2goSessionProfilesFILE(inifiles.X2goIniFile):
def get_session_param(self, profile_id_or_name, param):
"""\
- STILL UNDOCUMENTED
+ Get a single L{X2goSession} parameter from a specific session profile.
+
+ @param profile_id_or_name: either profile ID or profile name is accepted
+ @type profile_id_or_name: C{str}
+ @param param: the parameter name in the L{X2goSession} constructor method
+ @type param: C{str}
+
+ @return: the value of the session profile option represented by C{param}
+ @rtype: depends on the session profile option requested
"""
return self.to_session_params(profile_id_or_name)[param]
diff --git a/x2go/backends/profiles/_gconf.py b/x2go/backends/profiles/_gconf.py
index 13d8ccf..177c3a5 100644
--- a/x2go/backends/profiles/_gconf.py
+++ b/x2go/backends/profiles/_gconf.py
@@ -39,9 +39,18 @@ class X2goSessionProfilesGCONF(inifiles.X2goIniFile):
defaultSessionProfile = X2GO_SESSIONPROFILE_DEFAULTS
_non_profile_sections = ('embedded')
- def __init__(self, config_files=X2GO_SESSIONPROFILES_CONFIGFILES, defaults=None, session_profile_defaults=None, logger=None, loglevel=log.loglevel_DEFAULT):
+ def __init__(self, session_profile_defaults=None, logger=None, loglevel=log.loglevel_DEFAULT):
"""\
- STILL UNDOCUMENTED
+ Retrieve X2Go session profiles from gconf daemon.
+
+ @param session_profile_defaults: a default session profile
+ @type session_profile_defaults: C{dict}
+ @param logger: you can pass an L{X2goLogger} object to the
+ L{X2goSessionProfilesGCONF} constructor
+ @type logger: L{X2goLogger} instance
+ @param loglevel: if no L{X2goLogger} object has been supplied a new one will be
+ constructed with the given loglevel
+ @type loglevel: C{int}
"""
raise X2goNotImplementedYetException('GCONF backend support is not implemented yet')
diff --git a/x2go/backends/profiles/_httpsbroker.py b/x2go/backends/profiles/_httpsbroker.py
index 2118468..b56b237 100644
--- a/x2go/backends/profiles/_httpsbroker.py
+++ b/x2go/backends/profiles/_httpsbroker.py
@@ -39,9 +39,18 @@ class X2goSessionProfilesHTTPSBROKER(inifiles.X2goIniFile):
defaultSessionProfile = X2GO_SESSIONPROFILE_DEFAULTS
_non_profile_sections = ('embedded')
- def __init__(self, config_files=X2GO_SESSIONPROFILES_CONFIGFILES, defaults=None, session_profile_defaults=None, logger=None, loglevel=log.loglevel_DEFAULT):
+ def __init__(self, session_profile_defaults=None, logger=None, loglevel=log.loglevel_DEFAULT):
"""\
- STILL UNDOCUMENTED
+ Retrieve X2Go session profiles from a HTTPS session broker.
+
+ @param session_profile_defaults: a default session profile
+ @type session_profile_defaults: C{dict}
+ @param logger: you can pass an L{X2goLogger} object to the
+ L{X2goSessionProfilesHTTPSBROKER} constructor
+ @type logger: L{X2goLogger} instance
+ @param loglevel: if no L{X2goLogger} object has been supplied a new one will be
+ constructed with the given loglevel
+ @type loglevel: C{int}
"""
raise X2goNotImplementedYetException('HTTPSBROKER backend support is not implemented yet')
diff --git a/x2go/backends/profiles/_winreg.py b/x2go/backends/profiles/_winreg.py
index dee6904..7fb1319 100644
--- a/x2go/backends/profiles/_winreg.py
+++ b/x2go/backends/profiles/_winreg.py
@@ -39,9 +39,18 @@ class X2goSessionProfilesWINREG(inifiles.X2goIniFile):
defaultSessionProfile = X2GO_SESSIONPROFILE_DEFAULTS
_non_profile_sections = ('embedded')
- def __init__(self, config_files=X2GO_SESSIONPROFILES_CONFIGFILES, defaults=None, session_profile_defaults=None, logger=None, loglevel=log.loglevel_DEFAULT):
+ def __init__(self, session_profile_defaults=None, logger=None, loglevel=log.loglevel_DEFAULT):
"""\
- STILL UNDOCUMENTED
+ Retrieve X2Go session profiles from the Windows registry.
+
+ @param session_profile_defaults: a default session profile
+ @type session_profile_defaults: C{dict}
+ @param logger: you can pass an L{X2goLogger} object to the
+ L{X2goSessionProfilesWINREG} constructor
+ @type logger: L{X2goLogger} instance
+ @param loglevel: if no L{X2goLogger} object has been supplied a new one will be
+ constructed with the given loglevel
+ @type loglevel: C{int}
"""
raise X2goNotImplementedYetException('WINREG backend support is not implemented yet')
diff --git a/x2go/inifiles.py b/x2go/inifiles.py
index 9622072..0b843b2 100644
--- a/x2go/inifiles.py
+++ b/x2go/inifiles.py
@@ -67,13 +67,13 @@ class X2goIniFile(object):
@type config_files: C{list}
@param defaults: a cascaded Python dicitionary structure with ini file defaults (to override
Python X2go's hard coded defaults in L{defaults}
- @type defaults: dict
+ @type defaults: C{dict}
@param logger: you can pass an L{X2goLogger} object to the
- L{X2goFwServer} constructor
+ L{X2goIniFile} constructor
@type logger: L{X2goLogger} instance
@param loglevel: if no L{X2goLogger} object has been supplied a new one will be
constructed with the given loglevel
- @type loglevel: int
+ @type loglevel: C{int}
"""
# make sure a None type gets turned into list type
diff --git a/x2go/mimebox.py b/x2go/mimebox.py
index ab4cd35..7ac56c4 100644
--- a/x2go/mimebox.py
+++ b/x2go/mimebox.py
@@ -162,6 +162,11 @@ class X2goMIMEboxQueue(threading.Thread):
change of the MIME box action will be valid for the next incoming file in the MIME box
directory.
+ @param mimebox_action: the MIME box action to execute for incoming files
+ @type mimebox_action: C{str} or C{obj}
+ @param kwargs: extra options for the specified MIME box action
+ @type kwargs: C{dict}
+
"""
if mimebox_action in defaults.X2GO_MIMEBOX_ACTIONS.keys():
mimebox_action = defaults.X2GO_MIMEBOX_ACTIONS[mimebox_action]
diff --git a/x2go/printqueue.py b/x2go/printqueue.py
index 3f3d10a..0fb8d4d 100644
--- a/x2go/printqueue.py
+++ b/x2go/printqueue.py
@@ -175,6 +175,9 @@ class X2goPrintQueue(threading.Thread):
@param print_action: new print action to be valid for incoming print jobs
@type print_action: C{str} or C{class}
+ @param kwargs: extra options for the specified print action
+ @type kwargs: C{dict}
+
"""
if print_action in defaults.X2GO_PRINT_ACTIONS.keys():
print_action = defaults.X2GO_PRINT_ACTIONS[print_action]
hooks/post-receive
--
python-x2go.git (Python X2Go Client API)
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "python-x2go.git" (Python X2Go Client API).
More information about the x2go-commits
mailing list