[Python-checkins] r43350 - sandbox/trunk/welease sandbox/trunk/welease/python-icon.png sandbox/trunk/welease/python-logo.gif sandbox/trunk/welease/welease.glade sandbox/trunk/welease/welease.gladep sandbox/trunk/welease/welease.py

anthony.baxter python-checkins at python.org
Mon Mar 27 15:45:45 CEST 2006


Author: anthony.baxter
Date: Mon Mar 27 15:45:44 2006
New Revision: 43350

Added:
   sandbox/trunk/welease/
   sandbox/trunk/welease/python-icon.png   (contents, props changed)
   sandbox/trunk/welease/python-logo.gif   (contents, props changed)
   sandbox/trunk/welease/welease.glade
   sandbox/trunk/welease/welease.gladep
   sandbox/trunk/welease/welease.py
Log:
A GUI for making Python releases.


Added: sandbox/trunk/welease/python-icon.png
==============================================================================
Binary file. No diff available.

Added: sandbox/trunk/welease/python-logo.gif
==============================================================================
Binary file. No diff available.

Added: sandbox/trunk/welease/welease.glade
==============================================================================
--- (empty file)
+++ sandbox/trunk/welease/welease.glade	Mon Mar 27 15:45:44 2006
@@ -0,0 +1,901 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+
+<widget class="GtkWindow" id="weleaseMainWindow">
+  <property name="width_request">600</property>
+  <property name="height_request">500</property>
+  <property name="visible">True</property>
+  <property name="title" translatable="yes">Welease Python!</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="default_width">400</property>
+  <property name="default_height">500</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="icon">python-icon.png</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+  <signal name="delete_event" handler="on_weleaseMainWindow_delete_event" last_modification_time="Mon, 27 Mar 2006 08:23:10 GMT"/>
+  <signal name="destroy_event" handler="on_weleaseMainWindow_delete_event" last_modification_time="Mon, 27 Mar 2006 08:23:27 GMT"/>
+
+  <child>
+    <widget class="GtkVBox" id="vbox1">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child>
+	<widget class="GtkMenuBar" id="menubar1">
+	  <property name="visible">True</property>
+	  <property name="pack_direction">GTK_PACK_DIRECTION_LTR</property>
+	  <property name="child_pack_direction">GTK_PACK_DIRECTION_LTR</property>
+
+	  <child>
+	    <widget class="GtkMenuItem" id="menuitem1">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">_File</property>
+	      <property name="use_underline">True</property>
+
+	      <child>
+		<widget class="GtkMenu" id="menu1">
+
+		  <child>
+		    <widget class="GtkSeparatorMenuItem" id="separatormenuitem1">
+		      <property name="visible">True</property>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="quit1">
+		      <property name="visible">True</property>
+		      <property name="label">gtk-quit</property>
+		      <property name="use_stock">True</property>
+		      <signal name="activate" handler="on_quit_activate" last_modification_time="Mon, 27 Mar 2006 10:32:35 GMT"/>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkMenuItem" id="menuitem4">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">_Help</property>
+	      <property name="use_underline">True</property>
+
+	      <child>
+		<widget class="GtkMenu" id="menu4">
+
+		  <child>
+		    <widget class="GtkMenuItem" id="about1">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_About</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_about_activate" last_modification_time="Mon, 27 Mar 2006 10:32:43 GMT"/>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkVBox" id="vbox3">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox2">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label2">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">&lt;b&gt;Welease Fwom:&lt;/b&gt;</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">True</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">6</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkComboBox" id="releaseSelector">
+		  <property name="visible">True</property>
+		  <property name="items" translatable="yes">trunk
+release24-maint
+release25-maint</property>
+		  <property name="add_tearoffs">False</property>
+		  <property name="focus_on_click">True</property>
+		  <signal name="changed" handler="on_releaseSelector_changed" last_modification_time="Mon, 27 Mar 2006 08:07:56 GMT"/>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkLabel" id="label10">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes"></property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">25</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkLabel" id="label9">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">&lt;b&gt;New Welease:&lt;/b&gt;</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">True</property>
+		  <property name="justify">GTK_JUSTIFY_RIGHT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">1</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkEntry" id="newRelease">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="editable">True</property>
+		  <property name="visibility">True</property>
+		  <property name="max_length">10</property>
+		  <property name="text" translatable="yes"></property>
+		  <property name="has_frame">True</property>
+		  <property name="invisible_char">*</property>
+		  <property name="activates_default">False</property>
+		  <property name="width_chars">10</property>
+		</widget>
+		<packing>
+		  <property name="padding">5</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkTable" id="table1">
+	      <property name="border_width">8</property>
+	      <property name="visible">True</property>
+	      <property name="n_rows">4</property>
+	      <property name="n_columns">2</property>
+	      <property name="homogeneous">False</property>
+	      <property name="row_spacing">4</property>
+	      <property name="column_spacing">0</property>
+
+	      <child>
+		<widget class="GtkButton" id="buildTarballsButton">
+		  <property name="visible">True</property>
+		  <property name="sensitive">False</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes">Build Tarballs</property>
+		  <property name="use_underline">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+		  <signal name="clicked" handler="on_buildTarballsButton_clicked" last_modification_time="Mon, 27 Mar 2006 10:24:52 GMT"/>
+		</widget>
+		<packing>
+		  <property name="left_attach">0</property>
+		  <property name="right_attach">1</property>
+		  <property name="top_attach">3</property>
+		  <property name="bottom_attach">4</property>
+		  <property name="x_options">fill</property>
+		  <property name="y_options"></property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkButton" id="exportSvnButton">
+		  <property name="visible">True</property>
+		  <property name="sensitive">False</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes">Export SVN</property>
+		  <property name="use_underline">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+		  <signal name="clicked" handler="on_exportSvnButton_clicked" last_modification_time="Mon, 27 Mar 2006 10:24:34 GMT"/>
+		</widget>
+		<packing>
+		  <property name="left_attach">0</property>
+		  <property name="right_attach">1</property>
+		  <property name="top_attach">2</property>
+		  <property name="bottom_attach">3</property>
+		  <property name="x_options">fill</property>
+		  <property name="y_options"></property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkButton" id="makeTagButton">
+		  <property name="visible">True</property>
+		  <property name="sensitive">False</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes">Tag Release</property>
+		  <property name="use_underline">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+		  <signal name="clicked" handler="on_makeTagButton_clicked" last_modification_time="Mon, 27 Mar 2006 10:24:43 GMT"/>
+		</widget>
+		<packing>
+		  <property name="left_attach">0</property>
+		  <property name="right_attach">1</property>
+		  <property name="top_attach">1</property>
+		  <property name="bottom_attach">2</property>
+		  <property name="x_options">fill</property>
+		  <property name="y_options"></property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkButton" id="checkReleaseButton">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes">Check Release</property>
+		  <property name="use_underline">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+		  <signal name="clicked" handler="on_checkReleaseButton_clicked" last_modification_time="Mon, 27 Mar 2006 10:24:25 GMT"/>
+		</widget>
+		<packing>
+		  <property name="left_attach">0</property>
+		  <property name="right_attach">1</property>
+		  <property name="top_attach">0</property>
+		  <property name="bottom_attach">1</property>
+		  <property name="x_options">fill</property>
+		  <property name="y_options"></property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkLabel" id="checkReleaseLabel">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">&lt;b&gt;Not Ok&lt;/b&gt;</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">True</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">16</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="left_attach">1</property>
+		  <property name="right_attach">2</property>
+		  <property name="top_attach">0</property>
+		  <property name="bottom_attach">1</property>
+		  <property name="x_options">fill</property>
+		  <property name="y_options"></property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkLabel" id="makeTagLabel">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">&lt;b&gt;Not Ok&lt;/b&gt;</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">True</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">16</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="left_attach">1</property>
+		  <property name="right_attach">2</property>
+		  <property name="top_attach">1</property>
+		  <property name="bottom_attach">2</property>
+		  <property name="x_options">fill</property>
+		  <property name="y_options"></property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkLabel" id="exportSvnLabel">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">&lt;b&gt;Not Ok&lt;/b&gt;</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">True</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">16</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="left_attach">1</property>
+		  <property name="right_attach">2</property>
+		  <property name="top_attach">2</property>
+		  <property name="bottom_attach">3</property>
+		  <property name="x_options">fill</property>
+		  <property name="y_options"></property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkLabel" id="buildTarballsLabel">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">&lt;b&gt;Not Ok&lt;/b&gt;</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">True</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">16</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="left_attach">1</property>
+		  <property name="right_attach">2</property>
+		  <property name="top_attach">3</property>
+		  <property name="bottom_attach">4</property>
+		  <property name="x_options">fill</property>
+		  <property name="y_options"></property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHSeparator" id="hseparator1">
+	      <property name="visible">True</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">2</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="currentCommandBox">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label7">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">Current Command:</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkEntry" id="currentCommandText">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="editable">True</property>
+		  <property name="visibility">True</property>
+		  <property name="max_length">0</property>
+		  <property name="text" translatable="yes"></property>
+		  <property name="has_frame">True</property>
+		  <property name="invisible_char">*</property>
+		  <property name="activates_default">False</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkButton" id="currentCommandAbort">
+		  <property name="visible">True</property>
+		  <property name="sensitive">False</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes">Abort</property>
+		  <property name="use_underline">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+		  <signal name="clicked" handler="on_currentCommandAbort_clicked" last_modification_time="Mon, 27 Mar 2006 12:25:33 GMT"/>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHSeparator" id="hseparator2">
+	      <property name="visible">True</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">2</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkVBox" id="vbox2">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <widget class="GtkLabel" id="outputLabel">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">&lt;b&gt;Command Output&lt;/b&gt;</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">True</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.0500000007451</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkScrolledWindow" id="scrolledwindow2">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
+	      <property name="shadow_type">GTK_SHADOW_IN</property>
+	      <property name="window_placement">GTK_CORNER_TOP_RIGHT</property>
+
+	      <child>
+		<widget class="GtkTextView" id="outputText">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="editable">True</property>
+		  <property name="overwrite">False</property>
+		  <property name="accepts_tab">True</property>
+		  <property name="justification">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap_mode">GTK_WRAP_CHAR</property>
+		  <property name="cursor_visible">True</property>
+		  <property name="pixels_above_lines">0</property>
+		  <property name="pixels_below_lines">0</property>
+		  <property name="pixels_inside_wrap">1</property>
+		  <property name="left_margin">0</property>
+		  <property name="right_margin">0</property>
+		  <property name="indent">0</property>
+		  <property name="text" translatable="yes"></property>
+		</widget>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkImage" id="image1">
+	  <property name="visible">True</property>
+	  <property name="pixbuf">python-logo.gif</property>
+	  <property name="xalign">1</property>
+	  <property name="yalign">0</property>
+	  <property name="xpad">0</property>
+	  <property name="ypad">0</property>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkWindow" id="aboutWindow">
+  <property name="title" translatable="yes">About Welease</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">False</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="icon">python-icon.png</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_SPLASHSCREEN</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkVBox" id="vbox4">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child>
+	<widget class="GtkHBox" id="hbox5">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <widget class="GtkLabel" id="aboutLabel">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">&lt;b&gt;Welease Python!&lt;/b&gt;
+
+A tool for automating Python releases.
+
+(C) 2006 Anthony Baxter
+
+&lt;tt&gt;anthony at interlink.com.au&lt;/tt&gt;</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">True</property>
+	      <property name="justify">GTK_JUSTIFY_CENTER</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">5</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkImage" id="image2">
+	      <property name="visible">True</property>
+	      <property name="pixbuf">python-logo.gif</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkButton" id="closeAboutButton">
+	  <property name="visible">True</property>
+	  <property name="can_focus">True</property>
+	  <property name="label" translatable="yes">Close</property>
+	  <property name="use_underline">True</property>
+	  <property name="relief">GTK_RELIEF_NORMAL</property>
+	  <property name="focus_on_click">True</property>
+	  <signal name="clicked" handler="on_closeAboutButton_clicked" last_modification_time="Mon, 27 Mar 2006 10:32:05 GMT"/>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkWindow" id="warningWindow">
+  <property name="border_width">8</property>
+  <property name="title" translatable="yes">Welease Warnings</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="icon">python-icon.png</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkVBox" id="vbox5">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">4</property>
+
+      <child>
+	<widget class="GtkLabel" id="warningTitleLabel">
+	  <property name="visible">True</property>
+	  <property name="label" translatable="yes">&lt;b&gt;Welease Python encountered a problem. 
+
+You might or might not be able to ignore it.&lt;/b&gt;</property>
+	  <property name="use_underline">False</property>
+	  <property name="use_markup">True</property>
+	  <property name="justify">GTK_JUSTIFY_CENTER</property>
+	  <property name="wrap">False</property>
+	  <property name="selectable">False</property>
+	  <property name="xalign">0.5</property>
+	  <property name="yalign">0.5</property>
+	  <property name="xpad">0</property>
+	  <property name="ypad">0</property>
+	  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	  <property name="width_chars">-1</property>
+	  <property name="single_line_mode">False</property>
+	  <property name="angle">0</property>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkLabel" id="warningText">
+	  <property name="visible">True</property>
+	  <property name="label" translatable="yes">&lt;warning text missing, huh?&gt;</property>
+	  <property name="use_underline">False</property>
+	  <property name="use_markup">False</property>
+	  <property name="justify">GTK_JUSTIFY_LEFT</property>
+	  <property name="wrap">True</property>
+	  <property name="selectable">False</property>
+	  <property name="xalign">0.5</property>
+	  <property name="yalign">0.5</property>
+	  <property name="xpad">0</property>
+	  <property name="ypad">0</property>
+	  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	  <property name="width_chars">-1</property>
+	  <property name="single_line_mode">False</property>
+	  <property name="angle">0</property>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkHSeparator" id="hseparator3">
+	  <property name="visible">True</property>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkHBox" id="hbox6">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <widget class="GtkButton" id="warningStopButton">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label" translatable="yes">Stop</property>
+	      <property name="use_underline">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <signal name="clicked" handler="on_warningStopButton_clicked" last_modification_time="Mon, 27 Mar 2006 12:38:24 GMT"/>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="label12">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes"></property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">17</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="warningContinueButton">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label" translatable="yes">Ignore, and continue</property>
+	      <property name="use_underline">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <signal name="clicked" handler="on_warningContinueButton_clicked" last_modification_time="Mon, 27 Mar 2006 12:32:58 GMT"/>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">8</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+</glade-interface>

Added: sandbox/trunk/welease/welease.gladep
==============================================================================
--- (empty file)
+++ sandbox/trunk/welease/welease.gladep	Mon Mar 27 15:45:44 2006
@@ -0,0 +1,8 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd">
+
+<glade-project>
+  <name>Welease</name>
+  <program_name>welease</program_name>
+  <gnome_support>FALSE</gnome_support>
+</glade-project>

Added: sandbox/trunk/welease/welease.py
==============================================================================
--- (empty file)
+++ sandbox/trunk/welease/welease.py	Mon Mar 27 15:45:44 2006
@@ -0,0 +1,376 @@
+#!/usr/bin/python
+
+# (C) 2006, Python Software Foundation.
+# This code is available under the Python Software Foundation license.
+
+# Author: Anthony Baxter
+
+# Welease... Wuby!
+# We haven't got a Wuby, Sir.
+# Are you sure? They seem vewy insistent about it.
+# We haven't got him.
+# Alright, welease... Pewl!
+# Er. We haven't got a Pewl, either, sir.
+# Vewy well, vewy well. I shall welease... Python!
+
+# A GUI for building Python releases. If a job's worth doing well, it's worth
+# overdoing.
+
+# This isn't the prettiest code in the world, but it should be good enough.
+# It was written in the space of a couple of hours, and could (and will) get
+# a refactoring as I add things to it.
+
+# TODO:
+#   Fix the scrolling in the output box
+#   Move configuration out to a .weleasewc (and maybe a prefs panel? naaah)
+#   Make the 'Abort' button work
+#   Add a *lot* more checks to the Check Release stage.
+
+import gnome
+gnomeProgram = gnome.init("Welease", "0.1")
+import pygtk
+pygtk.require('2.0')
+
+import gtk, gtk.glade
+
+from twisted.internet import gtk2reactor
+gtk2reactor.install()
+from twisted.internet import reactor, protocol, defer
+
+import os
+
+# Config section. This should all be put into a config file or something
+CheckoutHome = '/home/anthony/projects/python'
+CheckoutPaths = {
+    'trunk': CheckoutHome + '/pytrunk/python',
+    'release24-maint': CheckoutHome + '/release24-maint',
+    'release25-maint': CheckoutHome + '/release25-maint',
+}
+SVNROOT = 'svn+ssh://pythondev@svn.python.org/python'
+SvnPaths = {
+    'trunk': SVNROOT + '/trunk',
+    'release24-maint': SVNROOT + '/branches/release24-maint',
+    'release25-maint': SVNROOT + '/branches/release25-maint',
+}
+BuildPath = '/home/anthony/projects/python/build'
+# End config
+
+def buildEnv():
+    envVars = 'SSH_AUTH_SOCK', 'PATH', 'SSH_AGENT_PID'
+    d = {'GZIP':'--best', } # bzip defaults to '--best'
+    for e in envVars:
+        d[e] = os.getenv(e)
+    return d
+
+class WeleaseWindow:
+    currentBranch = 'trunk'
+    warnDefer = None
+
+    def __init__(self):
+        import gettext
+        domain = gettext.textdomain()
+        gtk.glade.textdomain(domain)
+        self.xml = gtk.glade.XML("welease.glade", None, gettext.textdomain())
+        self.xml.signal_autoconnect(self)
+        self.xml.get_widget('weleaseMainWindow').show_all()
+        output = self.xml.get_widget("outputText")
+        self.logger = TextViewer(output.get_buffer())
+        #self.logger.set_visible(self.xml.get_widget('scrolledwindow2'))
+
+    def warnPopup(self, message, fatal=True, d=None):
+        if d is None: print "**", message
+        if self.warnDefer is not None:
+            # chain warnings
+            nd = defer.Deferred()
+            def makepopup(x):
+                self.warnPopup(message, fatal=fatal, d=nd)
+                return x
+            self.warnDefer.addCallbacks(makepopup, makepopup)
+            return nd
+
+        self.xml.get_widget('warningContinueButton').set_sensitive(not fatal)
+        self.xml.get_widget('warningText').set_text(message)
+        self.xml.get_widget('warningWindow').show_all()
+        if d is None:
+            d = defer.Deferred()
+        self.warnDefer = d
+        return self.warnDefer
+
+    def on_warningContinueButton_clicked(self, e):
+        self.xml.get_widget('warningWindow').hide_all()
+        d, self.warnDefer = self.warnDefer, None
+        d.callback(True)
+
+    def on_warningStopButton_clicked(self, e):
+        self.xml.get_widget('warningWindow').hide_all()
+        d, self.warnDefer = self.warnDefer, None
+        d.callback(False)
+
+    def on_weleaseMainWindow_delete_event(self, win, event):
+        reactor.stop()
+
+    def on_quit_activate(self, e):
+        reactor.stop()
+
+    def on_about_activate(self, e):
+        self.xml.get_widget('aboutWindow').show_all()
+
+    def on_closeAboutButton_clicked(self, e):
+        self.xml.get_widget('aboutWindow').hide_all()
+
+    def on_releaseSelector_changed(self, e):
+        relsel = self.xml.get_widget('releaseSelector')
+        model = relsel.get_model()
+        active = relsel.get_active()
+        self.currentBranch = model[active][0]
+
+    def on_currentCommandAbort_clicked(self, e):
+        self.warnPopup("Sorry 'Abort' not implemented yet")
+
+    def do_command(self, cmdargs, capture=False):
+        pprint_cmd = ''
+        for x in cmdargs:
+            if ' ' in x:
+                pprint_cmd += "'%s' "%x
+            else:
+                pprint_cmd += '%s '%x
+
+        self.logger.write('Executing "%s"\n'%pprint_cmd)
+        if capture:
+            pp = ProcessCapture(self.logger)
+        else:
+            pp = ProcessOutput(self.logger)
+        reactor.spawnProcess(pp, cmdargs[0], cmdargs, buildEnv())
+        ccmdtext = self.xml.get_widget('currentCommandText')
+        abortButton = self.xml.get_widget('currentCommandAbort')
+        abortButton.set_sensitive(True)
+        ccmdtext.set_text(pprint_cmd)
+        def clear_ccmd(x):
+            ccmdtext.set_text('')
+            abortButton.set_sensitive(False)
+            return x
+        d = pp.defer
+        d.addCallback(clear_ccmd)
+        return d
+
+    def on_checkReleaseButton_clicked(self, e):
+        if not self.currentBranch:
+            return
+        self.newRelease = self.xml.get_widget('newRelease').get_text()
+        if not self.newRelease:
+            return self.warnPopup('You need to specify the release name!')
+
+        self.checkReleaseBuildTestVersion()
+
+    def checkReleaseBuildTestVersion(self):
+        checkout = CheckoutPaths[self.currentBranch]
+        buildtest = "/tmp/welease_testversion%s"%(os.getpid())
+        open("%s.c"%(buildtest), "w").write(TestVersionCode)
+        d = self.do_command(["gcc", "-I%s"%checkout, "-o", buildtest,
+                            "%s.c"%buildtest])
+        d.addCallback(lambda x:self.do_command([buildtest,], capture=True))
+        d.addCallback(self.checkReleaseTestVersion)
+
+    def checkReleaseTestVersion(self, (output, error)):
+        if output != '%s %s\n'%(self.newRelease, self.newRelease):
+            return self.warnPopup('Include/patchlevel.h is not correct')
+
+        self.checkReleaseDone()
+
+    def checkReleaseDone(self):
+        buildtest = "/tmp/welease_testversion%s"%(os.getpid())
+        os.unlink(buildtest)
+        os.unlink('%s.c'%buildtest)
+        self.xml.get_widget('checkReleaseLabel').set_text('Ok!')
+        self.xml.get_widget('makeTagButton').set_sensitive(True)
+
+
+
+    def on_makeTagButton_clicked(self, e):
+        tagName = 'r' + self.newRelease.replace('.', '')
+        self.tagPath = '%s/tags/%s'%(SVNROOT, tagName)
+        d = self.do_command(['svn', 'info', self.tagPath], capture=True)
+        d.addCallback(self.makeTagCheckSvnExists)
+
+    def makeTagCheckSvnExists(self, (stdout, stderr)):
+        if 'Node Kind' in stdout:
+            # uh oh.
+            d = self.warnPopup('Tag %s is already in SVN!'%(self.tagPath) +
+                               'svn rm first to recreate it',
+                               fatal=False)
+            d.addCallback(lambda x: x==True and self.makeTagDone(0))
+            return
+
+        svnroot = SvnPaths[self.currentBranch]
+        tagName = 'r' + self.newRelease.replace('.', '')
+
+        d = self.do_command(['svn', 'cp',
+                    '-m', 'Tagging for release of Python %s'%(self.newRelease),
+                    svnroot, self.tagPath])
+        d.addCallback(self.makeTagDone)
+
+    def makeTagDone(self, exitval):
+        if exitval == 0:
+            self.xml.get_widget('makeTagLabel').set_text('Ok!')
+            self.xml.get_widget('exportSvnButton').set_sensitive(True)
+        else:
+            self.warnPopup("svn cp exited with code %d"%(exitval))
+
+    def on_exportSvnButton_clicked(self, e):
+        self.exportPath = BuildPath + '/Python-%s'%(self.newRelease)
+        if os.path.exists(self.exportPath):
+            d = self.warnPopup('%s already exists'%self.exportPath, fatal=False)
+            d.addCallback(lambda x: x==True and self.exportSvnDone(0))
+            return
+        d = self.do_command(['svn', 'export', self.tagPath, self.exportPath])
+        d.addCallback(self.exportSvnDone)
+
+    def exportSvnDone(self, exitval):
+        if exitval == 0:
+            self.xml.get_widget('exportSvnLabel').set_text('Ok!')
+            self.xml.get_widget('buildTarballsButton').set_sensitive(True)
+        else:
+            self.warnPopup("svn export exited with code %d"%(exitval))
+
+    def on_buildTarballsButton_clicked(self, e):
+        os.chdir(BuildPath)
+        rdir = 'Python-%s'%self.newRelease
+        d = self.do_command(["tar", "--gzip", "-cf", "%s.tgz"%rdir, rdir])
+        d.addCallback(lambda x: x == 0 and self.do_command(
+                ["tar", "--bzip2", "-cf", "%s.tar.bz2"%rdir, rdir]))
+        d.addCallback(self.buildTarballsDone)
+
+
+    def buildTarballsDone(self, exitcode):
+        self.xml.get_widget('buildTarballsLabel').set_text('Ok!')
+
+    def __getattr__(self, name):
+        if not name.startswith('_'):
+            print "WeleaseMainWindow has no attribute %s"%(name)
+        raise AttributeError(name)
+
+class TextViewer:
+    MAXLINES = 5000
+    DELETECHUNK = 100
+
+    def __init__(self, widget):
+        self.buffer = widget
+        self.scroll = None
+
+    def set_visible(self, scroll):
+        self.scroll = scroll
+        if scroll:
+            adj = self.scroll.get_vadjustment()
+            adj.set_value(adj.upper)
+
+    def write(self, text):
+        b = self.buffer
+        b.insert(b.get_end_iter(), text)
+        lines = b.get_line_count()
+        if lines > self.MAXLINES:
+            b.delete(b.get_start_iter(),
+                     b.get_iter_at_line_offset(self.DELETECHUNK,0))
+        if self.scroll is not None:
+            print "scrolling"
+            adj = self.scroll.get_vadjustment()
+            adj.set_value(adj.upper)
+
+    def flush(self):
+        pass
+
+class ProcessOutput(protocol.ProcessProtocol):
+    def __init__(self, output):
+        self.output = output
+        self.defer = defer.Deferred()
+
+    def connectionMade(self):
+        self.output.write("[process spawned]\n")
+
+    def outReceived(self, data):
+        self.output.write(data)
+
+    def errReceived(self, data):
+        self.output.write(data)
+
+    def processEnded(self, status_object):
+        exitval = status_object.value.exitCode
+        self.output.write("[process ended with exitcode %d]\n"%(exitval))
+        self.triggerDeferred(exitval)
+
+    def triggerDeferred(self, exitval):
+        self.defer.callback(exitval)
+        self.defer = None
+
+class ProcessCapture(ProcessOutput):
+
+    def __init__(self, output):
+        ProcessOutput.__init__(self, output)
+        self.stdout = ""
+        self.stderr = ""
+
+    def outReceived(self, data):
+        self.stdout += data
+        ProcessOutput.outReceived(self, data)
+
+    def errReceived(self, data):
+        self.stderr += data
+        ProcessOutput.outReceived(self, data)
+
+    def triggerDeferred(self, exitval):
+        self.defer.callback((self.stdout, self.stderr))
+        self.defer = None
+
+
+def main():
+    win = WeleaseWindow()
+    curpath = os.getcwd()
+    reactor.run()
+    os.chdir(curpath)
+
+
+
+TestVersionCode = r"""
+#include <Include/patchlevel.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int main() {
+    char level, *release=malloc(20), *rel2=malloc(4);
+
+    int release_level = PY_RELEASE_LEVEL;
+
+    switch (release_level) {
+        case PY_RELEASE_LEVEL_ALPHA:
+                    level = 'a';
+                    break;
+        case PY_RELEASE_LEVEL_BETA:
+                    level = 'b';
+                    break;
+        case PY_RELEASE_LEVEL_GAMMA:
+                    level = 'c';
+                    break;
+        default:
+                    level = '?';
+                    break;
+    }
+
+    if (release_level == PY_RELEASE_LEVEL_FINAL && PY_RELEASE_SERIAL != 0) {
+        printf("error: FINAL releases should not have a serial!\n");
+        exit(1);
+    }
+    if (release_level != PY_RELEASE_LEVEL_FINAL) {
+        sprintf(rel2, "%c%d", level, PY_RELEASE_SERIAL);
+    }
+    if (PY_MICRO_VERSION) {
+        sprintf(release, "%d.%d.%d%s", PY_MAJOR_VERSION, PY_MINOR_VERSION, PY_MICRO_VERSION, rel2);
+    } else {
+        sprintf(release, "%d.%d%s", PY_MAJOR_VERSION, PY_MINOR_VERSION, rel2);
+    }
+
+    printf("%s %s\n", PY_VERSION, release);
+    exit(0);
+}
+"""
+
+if __name__ == "__main__":
+    main()


More information about the Python-checkins mailing list