bugfix #3544364 untruncated password on savefs command

buhfix #3544379 disable selection if vfat type devices
featrq #3544379 add Tab Archives Infos
This commit is contained in:
a-sansara 2012-07-15 20:38:53 +00:00
parent 704d9fb0da
commit 93298ac71a
14 changed files with 1778 additions and 73 deletions

View File

@ -1,15 +1,18 @@
GPyFSA 0.33 (2012-14-07)
GPyFSA 0.34 (2012-15-07)
=========================
New General Features
-------------------------
* Add Tab Archives Infos
* Add Archlinux Package
Bugfixes
-------------------------
* [#3544379] disable selection if vfat type devices
* [#3544364] untruncated password on savefs command
* [#3540527] images displaying
* [#3540526] application launching with strict call python2
* [#2988575] add log file wich doesn't exist by default

View File

@ -0,0 +1,57 @@
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# #
# software : GPyFSA <http://gpyfsa.sourceforge.net/> #
# version : 0.34 #
# date : 2012-07-15 #
# licence : GPLv3.0 <http://www.gnu.org/licenses/> #
# author : a-Sansara <http://www.a-sansara.net/> #
# copyright : pluie.org <http://www.pluie.org/> #
# #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#
# This file is part of GPyFSA.
#
# GPyFSA is free software (free as in speech) : you can redistribute it and/or
# modify it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GPyFSA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GPyFSA. If not, see <http://www.gnu.org/licenses/>.
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
import gtk
import gpyfsa_conf as conf
class AboutDialog(gtk.AboutDialog):
def __init__(self, parent=None):
gtk.AboutDialog.__init__(self)
# Set up the UI
self.__initialize_dialog_widgets()
#################### Private Methods ####################
def __initialize_dialog_widgets(self):
self.set_name(conf.APPNAME)
self.set_version(conf.APPVERSION)
self.set_copyright(conf.COPYRIGHTS)
self.set_logo(gtk.gdk.pixbuf_new_from_file(conf.SCALABLE_ICON))
self.set_translator_credits(conf.TRANSLATORS)
self.set_license(conf.LICENSE)
self.set_website(conf.WEBSITE)
self.set_website_label(conf.APPNAME)
self.set_authors(conf.AUTHORS)
self.set_artists(conf.ARTISTS)
# Show all widgets
self.show_all()

View File

@ -3,8 +3,8 @@
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# #
# software : GPyFSA <http://gpyfsa.sourceforge.net/> #
# version : 0.33 #
# date : 2012-07-14 #
# version : 0.34 #
# date : 2012-07-15 #
# licence : GPLv3.0 <http://www.gnu.org/licenses/> #
# author : a-Sansara <http://www.a-sansara.net/> #
# copyright : pluie.org <http://www.pluie.org/> #
@ -33,6 +33,7 @@ def get_path(default, destination):
if not os.path.exists(destination):
return os.path.abspath(default)+'/'
else:
# print(os.path.abspath(destination)+'/')
return os.path.abspath(destination)+'/'
PATH_SRC = os.path.abspath(os.path.dirname(sys.argv[0]))
@ -68,9 +69,13 @@ K_DEV_RWRIT = 8
####################### (K_NAME , K_NOVAL, K_SELFVAL)
SAVEOPT = (('o' , True , ),('v',True,),('d',True,),('L',False,True),('s',False,False),('e',False,False),('c',False,False),('z',False,True),('j',False,True))
K_DEV_PIX = 0
K_DEV_ACTIVATABLE = 1
K_DEV_ACTIVE = 2
K_DEV = 3
K_DEV_ROOT = 1
K_DEV_UNSUP = 2
K_DEV_SUPPORT = 3
K_DEV_ACTIVATABLE = 4
K_DEV_ACTIVE = 5
K_DEV = 6
L_COLSNAME = ('',_('device'),_('type'),_('label'),_('size'),_('used'),_('free'),_('%used'),_('mount point'))
IMG_TV_DEVICE = PATH_IMG+'gpyfsa_dev.png'
IMG_TV_DEVICE_LOCKED = PATH_IMG+'gpyfsa_devlocked.png'
@ -79,6 +84,7 @@ K_TYPE = K_FILTER_NAME = PAGE_SAVE = 0
K_TITLE = K_FILTER_PATTERN = PAGE_REST = 1
K_FILTER = PAGE_ARCH = 2
CBDT_SAVEFS = 'SAVE', _('Save archive') , ((_('all'),'*'),(_('fsa archive'),'*.fsa'))
CBDT_ARCHFS = 'OPEN', _('Select archive') , ((_('all'),'*'),(_('fsa archive'),'*.fsa'))
COMPRESSION_LEVEL = ['lzo -3', 'gzip -2', 'gzip -6', 'gzip -9', 'bzip2 -2', 'bzip2 -5', 'lzma -1', 'lzma -6', 'lzma -9']
@ -94,9 +100,35 @@ sh = Shell()
def getClDev(key) : return K_DEV+key
def getGladeXML() :
#print(PATH_RES+APP_NAME+'/glade/'+APP_NAME+'.glade')
return gtk.glade.XML(PATH_RES+APP_NAME+'/glade/'+APP_NAME+'.glade',APP_NAME)
#print(PATH_RES+APP_NAME+'/glade/'+APP_NAME+'2.glade')
return gtk.glade.XML(PATH_RES+APP_NAME+'/glade/'+APP_NAME+'2.glade',APP_NAME)
def chdir(path) : return os.chdir(path)
def getShell() : return sh
def file_get_contents(filename):
with open(filename) as f:
return f.read()
# Application info
SCALABLE_ICON = PATH_IMG+'gpyfsa.png'
APPNAME = "GPyFSA"
APPVERSION = "0.33"
COPYRIGHTS = _("Copyright © 2010-2012 a-Sansara\n Copyright © 2010-2012 pluie.org")
WEBSITE = "https://sourceforge.net/projects/gpyfsa/"
AUTHORS = [
_('Developers:'),
'a-Sansara (http://www.a-sansara.net)',
'',
_('Contributors:'),
'Francois Dupoux for fsarchiver (http://www.fsarchiver.org/)',
]
ARTISTS = [
''
]
TRANSLATORS = _("translator-credits")
LICENSE = file_get_contents(os.path.abspath('../LICENSE'))

View File

@ -3,8 +3,8 @@
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# #
# software : GPyFSA <http://gpyfsa.sourceforge.net/> #
# version : 0.33 #
# date : 2012-07-14 #
# version : 0.34 #
# date : 2012-07-15 #
# licence : GPLv3.0 <http://www.gnu.org/licenses/> #
# author : a-Sansara <http://www.a-sansara.net/> #
# copyright : pluie.org <http://www.pluie.org/> #
@ -63,12 +63,13 @@ class DevListManager():
if not self.bseldev:
(model, miter) = self.gpyfsa['w_treedev'].get_selection().get_selected()
path = model.get_path(miter)
bunsup = model.get_value(miter, self.conf.K_DEV_UNSUP)
# disk expand
if len(path)==1 :
if self.gpyfsa['w_treedev'].row_expanded(path): self.gpyfsa['w_treedev'].collapse_row(path)
else : self.gpyfsa['w_treedev'].expand_row(path,True)
# device selection
elif miter != None and not model.get_value(miter, self.conf.getClDev(self.conf.K_DEV_RWRIT)):
elif miter != None and not model.get_value(miter, self.conf.getClDev(self.conf.K_DEV_RWRIT)) and not bunsup:
toggled = model.get_value(miter, self.conf.K_DEV_ACTIVE)
model.set_value(miter, self.conf.K_DEV_ACTIVE, not toggled)
self.setDevicesSelection(model.get_value(miter, self.conf.K_DEV),not toggled)
@ -135,20 +136,24 @@ class DevListManager():
return ["/dev/%s" % k for k,v in ldev]
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def preformatStoreData(self,ldata,activatable,imgFileName,active=False):
ldata.insert(0,active)
ldata.insert(0,activatable)
def preformatStoreData(self,ldata,activatable,isRoot,imgFileName,active=False,unsupport=False):
#print(str((active,activatable,unsupport)))
ldata.insert(0,bool(active and not unsupport))
ldata.insert(0,bool(activatable and not unsupport))
ldata.insert(0,not unsupport and not isRoot)
ldata.insert(0,unsupport)
ldata.insert(0,isRoot)
ldata.insert(0,gtk.gdk.pixbuf_new_from_file(imgFileName))
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def getTreeStoreDevices(self,oldModel=None):
# ICO ACTIVATABLE ACTIVE _K_DEV_ NO READ-WRITE
store = gtk.TreeStore(gtk.gdk.Pixbuf, 'gboolean', 'gboolean', str, str, str, str, str, str, str, str, 'gboolean')
# ICO ROOT UNSUPPORT SUPPORT ACTIVATABLE ACTIVE _K_DEV_ NO READ-WRITE UNSUPPORT
store = gtk.TreeStore(gtk.gdk.Pixbuf, 'gboolean', 'gboolean', 'gboolean','gboolean','gboolean', str, str, str, str, str, str, str, str, 'gboolean')
ldev = ProbeReader(self.conf).getListDevices()
for i,l in enumerate(ldev):
hasntLockedDev = True
self.preformatStoreData(l[self.conf.K_DISK],False,self.conf.IMG_TV_DEVICE)
self.preformatStoreData(l[self.conf.K_DISK],False,True,self.conf.IMG_TV_DEVICE)
diter = store.append(None,l[self.conf.K_DISK])
for j,dev in enumerate(l[self.conf.K_DEVICE]):
imgn = self.conf.IMG_TV_DEVICE
@ -163,28 +168,35 @@ class DevListManager():
if oiter != None: active = oldModel.get_value(oiter,self.conf.K_DEV_ACTIVE)
except :
pass
self.preformatStoreData(dev,not dev[self.conf.K_DEV_RWRIT],imgn,active)
bunsup = bool(dev[self.conf.K_DEV_TYPE]=="vfat")
self.preformatStoreData(dev,not dev[self.conf.K_DEV_RWRIT],False,imgn,active,bunsup)
# inspect later possible wrong length
store.append(diter,dev[:12])
if bunsup :
#print('dev[14] : '+str(dev[14]))
dev[14] = True
#print(str(dev[:15]))
store.append(diter,dev[:15])
return store
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def buildTreeDevices(self):
self.gpyfsa['w_treedev'].set_model(self.getTreeStoreDevices())
crtog = getNewWidget(gtk.CellRendererToggle(),(('activatable',False),('active',False)))
crtxt = getNewWidget(gtk.CellRendererText() ,(('scale',1.0),('foreground','#6C6C6C')))
crtog = getNewWidget(gtk.CellRendererToggle(),(('activatable',True ),('active',False)))
crtxt = getNewWidget(gtk.CellRendererText() ,(('scale',1.0),('foreground','#6C6C6C'),('background','#D4C8C8')))
for i,col in enumerate(self.conf.L_COLSNAME):
if i == 0:
tvcol = gtk.TreeViewColumn(col, gtk.CellRendererPixbuf(), pixbuf=0)
tvcol.pack_start(gtk.CellRendererPixbuf(),True)
tvcol.pack_start(crtog,True)
tvcol.set_attributes(crtog, active=self.conf.K_DEV_ACTIVE, visible=self.conf.K_DEV_ACTIVATABLE)
tvcol.set_attributes(crtog, active=self.conf.K_DEV_ACTIVE, sensitive=self.conf.K_DEV_ACTIVATABLE, visible=self.conf.K_DEV_SUPPORT)
tvcol.set_clickable(True)
insertWidget(self.gpyfsa['w_refresh_devices'],tvcol)
else :
tvcol = gtk.TreeViewColumn(col)
tvcol.pack_start(crtxt,True)
tvcol.set_attributes(crtxt, text=i+2, foreground_set=self.conf.getClDev(self.conf.K_DEV_RWRIT))
tvcol.set_attributes(crtxt, text=i+5, background_set=self.conf.K_DEV_UNSUP,foreground_set=self.conf.getClDev(self.conf.K_DEV_RWRIT))
self.gpyfsa['w_treedev'].append_column(tvcol)
self.gpyfsa['w_treedev'].set_rules_hint(True)

View File

@ -3,8 +3,8 @@
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# #
# software : GPyFSA <http://gpyfsa.sourceforge.net/> #
# version : 0.33 #
# date : 2012-07-14 #
# version : 0.34 #
# date : 2012-07-15 #
# licence : GPLv3.0 <http://www.gnu.org/licenses/> #
# author : a-Sansara <http://www.a-sansara.net/> #
# copyright : pluie.org <http://www.pluie.org/> #

View File

@ -3,8 +3,8 @@
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# #
# software : GPyFSA <http://gpyfsa.sourceforge.net/> #
# version : 0.33 #
# date : 2012-07-14 #
# version : 0.34 #
# date : 2012-07-15 #
# licence : GPLv3.0 <http://www.gnu.org/licenses/> #
# author : a-Sansara <http://www.a-sansara.net/> #
# copyright : pluie.org <http://www.pluie.org/> #
@ -38,10 +38,12 @@ except:
import gtk, pango, re #, thread, threading
from time import sleep
from gpyfsa_devlistmanager import DevListManager
from gpyfsa_about import AboutDialog
import gpyfsa_conf as conf
import gpyfsa_ui as ui
import gpyfsa_fsa as fsa
#gtk.gdk.threads_init()
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
@ -49,6 +51,7 @@ class GPyFSA(gtk.Window):
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def bugFix_GladeComboBoxEntry(self):
# save tab
self.w_saveArchiveHistory,combo,browse = gtk.combo_box_entry_new_text(),self.xml.get_widget('w_saveArchiveHistory'),self['w_saveArchiveBrowse']
self['w_saveArchiveHistory'].set_model(gtk.ListStore(str))
box = browse.get_parent()
@ -56,6 +59,14 @@ class GPyFSA(gtk.Window):
box.remove(browse)
box.pack_start(self['w_saveArchiveHistory'],True,True,0)
box.pack_start(browse,False,False,0)
# archive tab
self.w_infoArchiveHistory,combo1,browse1 = gtk.combo_box_entry_new_text(),self.xml.get_widget('w_infoArchiveHistory'),self['w_infoArchiveBrowse']
self['w_infoArchiveHistory'].set_model(gtk.ListStore(str))
box1 = browse1.get_parent()
box1.remove(combo1)
box1.remove(browse1)
box1.pack_start(self['w_infoArchiveHistory'],True,True,0)
box1.pack_start(browse1,False,False,0)
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def cleaningSaveFS(self):
@ -66,6 +77,13 @@ class GPyFSA(gtk.Window):
self.timer = 0
if self.pfsa.poll()==0: self['w_nb_savefs'].set_current_page(0)
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def evt_aboutDialogActivate(self, widget):
about = AboutDialog()
ret = about.run()
about.destroy()
return ret
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def checkCleaningSaveFS(self):
self.endTime+=100
@ -78,6 +96,15 @@ class GPyFSA(gtk.Window):
self.endSaveFSTime = 500
self.timer = ui.setTimeout(100, ui.endSaveFS, self.cleaningSaveFS, self.checkCleaningSaveFS, self['w_progress_savefs'])
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def terminateArchInfos(self):
ui.clearTimeout(self.timer)
self.endTime = 0
buff = self['w_info_log'].get_buffer();
content = conf.file_get_contents(conf.PATH_LOG)
buff.set_text(content)
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def switchControlSaveFS(self,active):
self['w_nb_savefs'].set_show_tabs(True)
@ -102,13 +129,31 @@ class GPyFSA(gtk.Window):
def evt_setArchivePath(self,path):
self.archivePath = path.rpartition('/')
if(self.archivePath[2]!=""):conf.chdir(self.archivePath[0])
self['w_saveArchiveHistory'].insert_text(0, path)
self['w_saveArchiveHistory'].set_active(0)
if(self['w_notebook'].get_current_page() == self['w_notebook'].page_num(self['frame_save'])):
self['w_saveArchiveHistory'].insert_text(0, path)
self['w_saveArchiveHistory'].set_active(0)
elif(self['w_notebook'].get_current_page() == self['w_notebook'].page_num(self['frame_archive'])):
self['w_infoArchiveHistory'].insert_text(0, path)
self['w_infoArchiveHistory'].set_active(0)
self.switchStateArchInfos()
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def evt_editComboBoxEntry(self,txt):
self['w_savefs'].set_sensitive(bool(self.dlm.dicseldev and txt and self.checkPassword(None,None,False)))
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def evt_archInfos(self,widget):
buff = self['w_info_log'].get_buffer();
path = self['w_infoArchiveHistory'].get_model().get_value(self['w_infoArchiveHistory'].get_active_iter(),0)
self.archivePath = path.rpartition('/')
cmd = ['fsarchiver','archinfo',path]
if self['w_infopass'].get_active():
cmd.append('-c'+self['w_infopass_value'].get_text())
self.logFile.close()
self.logFile = open(conf.PATH_LOG, 'w')
self.pfsa = conf.getShell().call(cmd,self.logFile,False)
self.timer = ui.setTimeout(100, ui.waitTimeout, self.terminateArchInfos, self.checkProgressAborting, (self.logReader,))
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def evt_saveFS(self,widget):
cmd = ui.buildFsaOptions(self,conf)
@ -122,8 +167,9 @@ class GPyFSA(gtk.Window):
self['w_saveArchiveHistory'].get_model().set_value(self['w_saveArchiveHistory'].get_active_iter(), 0, path)
cmd.append(path)
cmd.extend(self.dlm.getSortedSelDevList())
pcmd = cmd
if self.tmp!=0: pcmd[self.tmp] = "-c"+re.sub(r".","*",pcmd[self.tmp][2:])
pcmd = list(cmd)
if self.tmp!=0:
pcmd[self.tmp] = "-c"+re.sub(r".","*",pcmd[self.tmp][2:])
del self.tmp
self.logReader.clear("\n"+" ".join(pcmd)+"\n\n")
self.logReader.setVerbooseMode(self['w_fsaOpt_v'].get_active())
@ -159,6 +205,15 @@ class GPyFSA(gtk.Window):
aiter = self['w_saveArchiveHistory'].get_active_iter()
if(aiter != None): self['w_savefs'].set_sensitive(bool(self.dlm.dicseldev and self['w_saveArchiveHistory'].get_model().get_value(aiter,0) and password))
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def switchStateArchInfos(self, data=None):
password = True
if self['w_infopass'].get_active():
pass1 = self['w_infopass_value'].get_text()
password = bool(len(pass1)>5 and len(pass1)<65)
aiter = self['w_infoArchiveHistory'].get_active_iter()
if(aiter != None): self['w_archinfo'].set_sensitive(bool(self['w_infoArchiveHistory'].get_model().get_value(aiter,0) and password))
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def setCompressionStore(self):
liststore = gtk.ListStore(int, str)
@ -175,6 +230,9 @@ class GPyFSA(gtk.Window):
self['w_log'].modify_base(gtk.STATE_NORMAL,gtk.gdk.color_parse('#2E3436'))
self['w_log'].modify_text(gtk.STATE_NORMAL,gtk.gdk.color_parse('#FFF7BA'))
self['w_log'].modify_font(pango.FontDescription("Liberation mono normal 10"))
self['w_info_log'].modify_base(gtk.STATE_NORMAL,gtk.gdk.color_parse('#2E3436'))
self['w_info_log'].modify_text(gtk.STATE_NORMAL,gtk.gdk.color_parse('#FFF7BA'))
self['w_info_log'].modify_font(pango.FontDescription("Liberation mono normal 10"))
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def checkPassword(self,widget=None,data=None,testRefresh=True):
@ -207,11 +265,19 @@ class GPyFSA(gtk.Window):
self['w_savefs'].connect('clicked', self.evt_saveFS)
self['w_cancel_savefs'].connect('clicked', self.evt_cancelSaveFS)
self['gpyfsa'].connect("delete_event", gtk.main_quit)
dic = {"on_aboutDialog_activate" : self.evt_aboutDialogActivate }
self.xml.signal_autoconnect(dic)
self['w_infoArchiveBrowse'].connect("clicked", self.evt_browseFile, conf.CBDT_ARCHFS, self.evt_setArchivePath)
self['w_infopass'].connect("toggled", ui.setSensitivity , (self['w_infopass_value']))
self['w_infopass'].connect("toggled", self.switchStateArchInfos )
self['w_archinfo'].connect('clicked', self.evt_archInfos)
self['w_infopass_value'].connect("changed", self.switchStateArchInfos)
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def __getitem__(self, key):
# # # # > BUG FIX ! see bugFix_GladeComboBoxEntry() # # # #
if key == 'w_saveArchiveHistory': return self.w_saveArchiveHistory
if key == 'w_saveArchiveHistory' : return self.w_saveArchiveHistory
if key == 'w_infoArchiveHistory': return self.w_infoArchiveHistory
# # # # < BUG FIX # # # # # # # # # # # # # # # # # # # # #
return self.xml.get_widget(key)
@ -231,6 +297,7 @@ class GPyFSA(gtk.Window):
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def main():
GPyFSA()
gtk.window_set_default_icon_list(gtk.gdk.pixbuf_new_from_file(conf.SCALABLE_ICON))
gtk.main()
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

View File

@ -3,8 +3,8 @@
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# #
# software : GPyFSA <http://gpyfsa.sourceforge.net/> #
# version : 0.33 #
# date : 2012-07-14 #
# version : 0.34 #
# date : 2012-07-15 #
# licence : GPLv3.0 <http://www.gnu.org/licenses/> #
# author : a-Sansara <http://www.a-sansara.net/> #
# copyright : pluie.org <http://www.pluie.org/> #

View File

@ -50,7 +50,9 @@ class Shell:
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def __call(self,cmd,stdoe=subp.PIPE,fdsClose=False):
p = None
if self.authCmd.has_key(cmd[0]): p = subp.Popen(cmd, stdout=stdoe, stderr=stdoe, close_fds=fdsClose)
if self.authCmd.has_key(cmd[0]):
print cmd[0]+' auth => '+str(cmd)
p = subp.Popen(cmd, stdout=stdoe, stderr=stdoe, close_fds=fdsClose)
return p
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

View File

@ -3,8 +3,8 @@
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# #
# software : GPyFSA <http://gpyfsa.sourceforge.net/> #
# version : 0.33 #
# date : 2012-07-14 #
# version : 0.34 #
# date : 2012-07-15 #
# licence : GPLv3.0 <http://www.gnu.org/licenses/> #
# author : a-Sansara <http://www.a-sansara.net/> #
# copyright : pluie.org <http://www.pluie.org/> #
@ -113,6 +113,7 @@ def buildFsaOptions(gpyfsa,conf):
if opt[conf.K_NAME]=="c": gpyfsa.tmp = len(cmd)
if not noAdd : noAdd = v.strip() == ''
if not noAdd : cmd.append('-'+opt[conf.K_NAME]+v)
print(str(cmd))
return cmd
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
@ -141,6 +142,18 @@ def progressTimeout(callBack, clearCallback, fsaLogReader, progressbar, msgWait=
if not progress : callBack()
return progress
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def waitTimeout(callBack, clearCallback, fsaLogReader):
progress = not clearCallback()
if not progress : callBack()
return progress
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def endArchInfos(callBack,clearCallback):
bnotclear = not clearCallback()
if(bnotclear):callBack()
return bnotclear
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def endSaveFS(callBack,clearCallback,progressbar):
progressbar.pulse()

View File

@ -3,8 +3,8 @@
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# #
# software : GPyFSA <http://gpyfsa.sourceforge.net/> #
# version : 0.33 #
# date : 2012-07-14 #
# version : 0.34 #
# date : 2012-07-15 #
# licence : GPLv3.0 <http://www.gnu.org/licenses/> #
# author : a-Sansara <http://www.a-sansara.net/> #
# copyright : pluie.org <http://www.pluie.org/> #

View File

@ -2,7 +2,7 @@
[Desktop Entry]
Name=GPyFSA
Comment=GUI front end of fsarchiver with mounting facilities
Version=0.33
Version=0.34
Icon=gpyfsa
Exec=gpyfsa
Terminal=false

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -3,8 +3,8 @@
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# #
# software : GPyFSA <http://gpyfsa.sourceforge.net/> #
# version : 0.33 #
# date : 2012-07-14 #
# version : 0.34 #
# date : 2012-07-15 #
# licence : GPLv3.0 <http://www.gnu.org/licenses/> #
# author : a-Sansara <http://www.a-sansara.net/> #
# copyright : pluie.org <http://www.pluie.org/> #