[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"><b>Welease Fwom:</b></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"><b>New Welease:</b></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"><b>Not Ok</b></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"><b>Not Ok</b></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"><b>Not Ok</b></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"><b>Not Ok</b></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"><b>Command Output</b></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"><b>Welease Python!</b>
+
+A tool for automating Python releases.
+
+(C) 2006 Anthony Baxter
+
+<tt>anthony at interlink.com.au</tt></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"><b>Welease Python encountered a problem.
+
+You might or might not be able to ignore it.</b></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"><warning text missing, huh?></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