[bitbake-devel] [PATCH 1/2] hob2: update DeployImageDialog for seperated tool

Kang Kai Kai.Kang at windriver.com
Wed Jun 6 03:01:32 UTC 2012


On 2012年06月06日 10:33, Kang Kai wrote:
> On 2012年06月06日 01:38, Darren Hart wrote:
>>
>> On 06/04/2012 08:37 PM, Kang Kai wrote:
>>> Part of [Yocto 2388]
>>>
>>> Update class DeployImageDialog that could be used by a standalone
>>> deploy image tool.
>>>
>>> Update the method to get all usb device to avoid runtime error, and
>>> get the deploy image process exit status then give user a information
>>> dialog.
>
> Hi Darren,
>
> Thanks a lot for your detail comments.
>
> One thing I want to address that the difference between standaonle 
> widget and called by hob is that the standalone widget add a image 
> selection button.
> Maybe I use the wrong word "singleton" but that why I update the 
> deploy image dialog layout.
>
>> These are functionally different tasks that should probably broken up
>> into a couple patches. This allows us to revert one while maintaining
>> the other should a problem arise. It also makes reviewing the code 
>> easier.
> Ok, I'll break up it.
>
>>
>>> Remove some extra spaces at same time.
>>>
>>> Signed-off-by: Kang Kai<kai.kang at windriver.com>
>>> ---
>>>   bitbake/lib/bb/ui/crumbs/hig.py |   82 
>>> ++++++++++++++++++++++++++++++++-------
>>>   1 files changed, 68 insertions(+), 14 deletions(-)
>>>
>>> diff --git a/bitbake/lib/bb/ui/crumbs/hig.py 
>>> b/bitbake/lib/bb/ui/crumbs/hig.py
>>> index 7c9e73f..7d8daad 100644
>>> --- a/bitbake/lib/bb/ui/crumbs/hig.py
>>> +++ b/bitbake/lib/bb/ui/crumbs/hig.py
>>> @@ -20,6 +20,7 @@
>>>   # with this program; if not, write to the Free Software 
>>> Foundation, Inc.,
>>>   # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>>>
>>> +import glob
>>>   import gtk
>>>   import gobject
>>>   import hashlib
>>> @@ -63,7 +64,7 @@ class CrumbsMessageDialog(CrumbsDialog):
>>>       """
>>>       def __init__(self, parent=None, label="", icon=gtk.STOCK_INFO):
>>>           super(CrumbsMessageDialog, self).__init__("", parent, 
>>> gtk.DIALOG_DESTROY_WITH_PARENT)
>>> -
>>> +
>>>           self.set_border_width(6)
>>>           self.vbox.set_property("spacing", 12)
>>>           self.action_area.set_property("spacing", 12)
>>> @@ -748,21 +749,28 @@ class DeployImageDialog (CrumbsDialog):
>>>
>>>       __dummy_usb__ = "--select a usb drive--"
>>>
>>> -    def __init__(self, title, image_path, parent, flags, 
>>> buttons=None):
>>> +    def __init__(self, title, image_path, parent, flags, 
>>> buttons=None, singleton=False):
>>>           super(DeployImageDialog, self).__init__(title, parent, 
>>> flags, buttons)
>>>
>>>           self.image_path = image_path
>>> +        self.singleton = singleton
>>>
>>>           self.create_visual_elements()
>>>           self.connect("response", self.response_cb)
>>>
>>>       def create_visual_elements(self):
>>> +        self.set_size_request(600, 400)
>>>           label = gtk.Label()
>>>           label.set_alignment(0.0, 0.5)
>>>           markup = "<span font_desc='12'>The image to be written 
>>> into usb drive:</span>"
>>>           label.set_markup(markup)
>>>           self.vbox.pack_start(label, expand=False, fill=False, 
>>> padding=2)
>>>
>>> +        table = gtk.Table(2, 10, False)
>>> +        table.set_col_spacings(5)
>>> +        table.set_row_spacings(5)
>>> +        self.vbox.pack_start(table, expand=True, fill=True)
>>> +
>>
>> It isn't obvious to me why things like setting the size request and
>> creating a new table are required to make this stand alone. Do these
>> changes fit under the "Update class DeployImageDialog that could be used
>> by a standalone deploy image tool." ? If so, fine. If not, they might be
>> better done in a separate patch.
>
> Without set the size request, the scroll bar doesn't show the text 
> when the deploy dialog shows.
> It is ok to a separate patch.
>
>>
>>
>>>           scroll = gtk.ScrolledWindow()
>>>           scroll.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
>>>           scroll.set_shadow_type(gtk.SHADOW_IN)
>>> @@ -770,11 +778,26 @@ class DeployImageDialog (CrumbsDialog):
>>>           tv.set_editable(False)
>>>           tv.set_wrap_mode(gtk.WRAP_WORD)
>>>           tv.set_cursor_visible(False)
>>> -        buf = gtk.TextBuffer()
>>> -        buf.set_text(self.image_path)
>>> -        tv.set_buffer(buf)
>>> +        self.buf = gtk.TextBuffer()
>>> +        self.buf.set_text(self.image_path)
>>> +        tv.set_buffer(self.buf)
>>>           scroll.add(tv)
>>> -        self.vbox.pack_start(scroll, expand=True, fill=True)
>>> +        table.attach(scroll, 0, 10, 0, 1)
>>> +
>>> +        if self.singleton:
>>> +                gobject.signal_new("select_image_clicked", self, 
>>> gobject.SIGNAL_RUN_FIRST,
>>> +                                   gobject.TYPE_NONE, ())
>>> +                icon = gtk.Image()
>>> +                pix_buffer = 
>>> gtk.gdk.pixbuf_new_from_file(hic.ICON_IMAGES_DISPLAY_FILE)
>>> +                icon.set_from_pixbuf(pix_buffer)
>>> +                button = gtk.Button("Select Image")
>>> +                button.set_image(icon)
>>> +                button.set_size_request(140, 50)
>>> +                table.attach(button, 9, 10, 1, 2, gtk.FILL, 0, 0, 0)
>>> +                button.connect("clicked", 
>>> self.select_image_button_clicked_cb)
>>> +
>>> +        separator = gtk.HSeparator()
>>> +        self.vbox.pack_start(separator, expand=False, fill=False, 
>>> padding=10)
>> What does the self.singleton indicate? How is it related to running
>> stand-alone or within Hob?
>
> As I mentioned above, I just add a image selection button when the 
> tool is run separately. It is convenience So I need to adjust the layout.
>
>
>>
>>>           self.usb_desc = gtk.Label()
>>>           self.usb_desc.set_alignment(0.0, 0.5)
>>> @@ -789,7 +812,7 @@ class DeployImageDialog (CrumbsDialog):
>>>           for usb in self.find_all_usb_devices():
>>>               self.usb_combo.append_text("/dev/" + usb)
>>>           self.usb_combo.set_active(0)
>>> -        self.vbox.pack_start(self.usb_combo, expand=True, fill=True)
>>> +        self.vbox.pack_start(self.usb_combo, expand=False, fill=False)
>> This would appear to be a superfluous layout change unrelated to the
>> patch topic...
>>
>>>           self.vbox.pack_start(self.usb_desc, expand=False, 
>>> fill=False, padding=2)
>>>
>>>           self.progress_bar = HobProgressBar()
>>> @@ -800,13 +823,19 @@ class DeployImageDialog (CrumbsDialog):
>>>           self.vbox.show_all()
>>>           self.progress_bar.hide()
>>>
>>> +    def set_image_text_buffer(self, image_path):
>>> +        self.buf.set_text(image_path)
>>> +
>>> +    def set_image_path(self, image_path):
>>> +        self.image_path = image_path
>>> +
>>>       def popen_read(self, cmd):
>>>           tmpout, errors = bb.process.run("%s" % cmd)
>>>           return tmpout.strip()
>>>
>>>       def find_all_usb_devices(self):
>>>           usb_devs = [ os.readlink(u)
>>> -            for u in self.popen_read('ls 
>>> /dev/disk/by-id/usb*').split()
>>> +            for u in glob.glob('/dev/disk/by-id/usb*')
>> Secondary to the goal of the patch, but why are we restricting ourselves
>> to sub drives? Why not read /proc/partitions and omit a configurable
>> blacklist of devices (like /dev/sda for example). Again, secondary to
>> this patch series.
>
> This update just to fix runtime error after commit 
> 094742bed2fc01d55f572da946fcfa7a48521401 when there is no USB device 
> then the program crashes.
> If we want to deploy to other device, I'll update it.
>
>>
>>>               if not re.search(r'part\d+', u) ]
>>>           return [ '%s' % u[u.rfind('/')+1:] for u in usb_devs ]
>>>
>>> @@ -815,6 +844,9 @@ class DeployImageDialog (CrumbsDialog):
>>>               (self.popen_read('cat 
>>> /sys/class/block/%s/device/vendor' % dev),
>>>               self.popen_read('cat /sys/class/block/%s/device/model' 
>>> % dev))
>>>
>>> +    def select_image_button_clicked_cb(self, button):
>>> +            self.emit('select_image_clicked')
>>> +
>>>       def usb_combo_changed_cb(self, usb_combo):
>>>           combo_item = self.usb_combo.get_active_text()
>>>           if not combo_item or combo_item == self.__dummy_usb__:
>>> @@ -826,12 +858,34 @@ class DeployImageDialog (CrumbsDialog):
>>>
>>>       def response_cb(self, dialog, response_id):
>>>           if response_id == gtk.RESPONSE_YES:
>>> +            lbl = ''
>>>               combo_item = self.usb_combo.get_active_text()
>>> -            if combo_item and combo_item != self.__dummy_usb__:
>>> +            if combo_item and combo_item != self.__dummy_usb__ and 
>>> self.image_path:
>>>                   cmdline = bb.ui.crumbs.utils.which_terminal()
>>>                   if cmdline:
>>> -                    cmdline += "\"sudo dd if=" + self.image_path + 
>>> " of=" + combo_item + "\""
>>> -                    bb.process.Popen(shlex.split(cmdline))
>>> +                    tmpname = os.tmpnam()
>>> +                    cmdline += "\"sudo dd if=" + self.image_path + 
>>> " of=" + combo_item + "; echo $?>  " + tmpname + "\""
>>> +                    deploy_process = 
>>> bb.process.Popen(shlex.split(cmdline))
>>> +                    deploy_process.wait()
>>> +                    tmpfile = open(tmpname)
>>> +                    if int(tmpfile.readline().strip()) == 0:
>>> +                        lbl = "<b>Deploy image successfully</b>"
>>> +                    else:
>>> +                        lbl = "<b>Deploy image failed</b>\nPlease 
>>> try again"
>>> +                    tmpfile.close()
>>> +                    os.remove(tmpname)
>>> +
>>> +            else:
>>> +                if not self.image_path:
>>> +                    lbl = "<b>No selection made</b>\nYou have not 
>>> selected image to deploy"
>> "<b>No selection made.</b>\nPlease select an image."
>>
>> Is<br>  appropriate here instead of \n?
>
> Ok, thanks.

I am afraid the <br> is not supported here. It obeys pango markup 
language and <br> is not  supported.

Regards,
Kai
>
>>
>>> +                else:
>>> +                    lbl = "<b>No selection made</b>\nYou have not 
>>> selected USB device"
>> "<b>No selection made.</b>\nPlease select a device."
>>
>> Again, why are we limiting devices to USB devices?
> Fine, if need I would update this part.
>
> Regards,
> Kai
>>
>>> +            if len(lbl):
>>> +                crumbs_dialog = CrumbsMessageDialog(self, lbl, 
>>> gtk.STOCK_DIALOG_INFO)
>>> +                button = crumbs_dialog.add_button("Close", 
>>> gtk.RESPONSE_OK)
>>> +                HobButton.style_button(button)
>>> +                crumbs_dialog.run()
>>> +                crumbs_dialog.destroy()
>>>
>>>       def update_progress_bar(self, title, fraction, status=None):
>>>           self.progress_bar.update(fraction)
>>> @@ -1035,7 +1089,7 @@ class LayerSelectionDialog (CrumbsDialog):
>>>           # create visual elements on the dialog
>>>           self.create_visual_elements()
>>>           self.connect("response", self.response_cb)
>>> -
>>> +
>>>       def create_visual_elements(self):
>>>           layer_widget, self.layer_store = 
>>> self.gen_layer_widget(self.layers, self.all_layers, self, None)
>>>           layer_widget.set_size_request(450, 250)
>>> @@ -1210,7 +1264,7 @@ class ImageSelectionDialog (CrumbsDialog):
>>>                           if f.endswith('.' + real_image_type):
>>>                               imageset.add(f.rsplit('.' + 
>>> real_image_type)[0].rsplit('.rootfs')[0])
>>>                               self.image_list.append(f)
>>> -
>>> +
>>>           for image in imageset:
>>>               self.image_store.set(self.image_store.append(), 0, 
>>> image, 1, False)
>>>
>>> @@ -1226,7 +1280,7 @@ class ImageSelectionDialog (CrumbsDialog):
>>>                       for f in self.image_list:
>>>                           if f.startswith(self.image_store[path][0] 
>>> + '.'):
>>>                               self.image_names.append(f)
>>> -                    break
>>> +                    break
>>>                   iter = self.image_store.iter_next(iter)
>>>
>>>   class ProxyDetailsDialog (CrumbsDialog):
>
>
> _______________________________________________
> bitbake-devel mailing list
> bitbake-devel at lists.openembedded.org
> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/bitbake-devel





More information about the bitbake-devel mailing list