def unpack(self): source = self._pkg["local_filename"] if source.endswith(".tar.gz"): with WorkDir(self.builddir): self.execute([ "tar", "xzf", source ]) else: raise NotImplementedError("Unpacking of file: %s" % (source))
def on_change_work_dir(self, index): '''Из списка выбран другой рабочий каталог''' if index == -1: if not self._activeWorkDir is None: self._activeWorkDir.save_state() self._activeWorkDir = None self.lwEntries.clear() self.clear_counters() else: self._activeWorkDir = WorkDir(unicode(self.cboxWorkDirs.itemText(index))) self.sync_lwEntries() print("Изменился текущий рабочий каталог")
def build(self): with WorkDir(self.extractdir): os.mkdir("build") os.chdir("build") configure_cmd = [ "../configure" ] configure_cmd += [ "--prefix=%s" % (self.env("prefix")) ] if "prebuild" in self.flags: configure_cmd += [ "--without-headers" ] configure_cmd += [ "--with-gnu-ld", "--with-gnu-as" ] configure_cmd += [ "--with-dwarf2" ] configure_cmd += [ "--disable-werror" ] configure_cmd += [ "--disable-threads" ] configure_cmd += [ "--disable-nls" ] configure_cmd += [ "--disable-shared" ] configure_cmd += [ "--disable-libssp" ] configure_cmd += [ "--disable-libmudflap" ] configure_cmd += [ "--disable-libgomp" ] if self.env("target") in [ "7tdmi", "cortex-m0", "cortex-m1", "cortex-m3", "cortex-m4" ]: configure_cmd += [ "--target=arm-none-eabi" ] configure_cmd += [ "--with-newlib" ] if self.env("target") == "7tdmi": configure_cmd += [ "--enable-interwork", "--enable-multilib" ] if self.env("target") in [ "cortex-m0", "cortex-m3", "cortex-m4" ]: configure_cmd += [ "--with-cpu=" + self.env("target") ] configure_cmd += [ "--disable-interwork", "--disable-multilib" ] if self.env("target") in [ "cortex-m0", "cortex-m3" ]: configure_cmd += [ "--with-float=soft" ] configure_cmd += [ "--with-mode=thumb" ] elif self.env("target") in [ "cortex-m4" ]: configure_cmd += [ "--with-fpu=fpv4-sp-d16", "--with-float=hard" ] configure_cmd += [ "--with-mode=thumb" ] elif self.env("target") == "avr": configure_cmd += [ "--target=avr" ] if ("c++" in self.flags) and ("prebuild" not in self.flags): configure_cmd += [ "--enable-languages=c,c++" ] else: configure_cmd += [ "--enable-languages=c" ] configure_cmd += [ "--with-system-zlib" ] configure_cmd += [ "--enable-target-optspace" ] self.execute(configure_cmd) self.execute_make()
def build(self): with WorkDir(self.extractdir): configure_cmd = [ "./configure" ] configure_cmd += [ "--prefix=%s" % (self.env("prefix")) ] if self.env("target") in [ "7tdmi", "cortex-m0", "cortex-m1", "cortex-m3", "cortex-m4" ]: # ARM architectures configure_cmd += [ "--target=arm-none-eabi" ] if self.env("target") == "7tdmi": configure_cmd += [ "--enable-interwork", "--enable-multilib" ] else: configure_cmd += [ "--enable-thumb" ] configure_cmd += [ "--disable-interwork", "--disable-multilib" ] elif self.env("target") == "avr": configure_cmd += [ "--target=avr" ] elif self.env("target") == "blackfin": configure_cmd += [ "--target=bfin" ] configure_cmd += [ "--without-gnu-ld" ] else: configure_cmd += [ "--target=%s" % (self.env("target")) ] configure_cmd += [ "--disable-nls" ] configure_cmd += [ "--disable-libssp" ] self.execute(configure_cmd) self.execute_make()
class MyWidget(QtGui.QWidget): CFG_FILE_NAME = u'.dirlist.cfg' LOCK_FILE_NAME = u'lockfile.lock' CFG_FILE_PATH = path.join(APP_PATH, CFG_FILE_NAME) LOCK_FILE_PATH = path.join(APP_PATH, LOCK_FILE_NAME) UI_FILE_PATH = path.join(APP_PATH, u'dlmanager.ui') ENTRIES_COLORS = { 'work': QtGui.QColor(50, 50, 50), 'new': QtGui.QColor(0, 200, 0), 'del': QtGui.QColor(200, 0, 0), } COLOR_NAMES = ('new', 'work', 'del') def __init__(self): super(MyWidget, self).__init__() self.lock_app() uic.loadUi(self.UI_FILE_PATH, self) self._dirList = self._get_dir_list() self._activeWorkDir = None self.sync_cboxWorkDirs() self._activeDialogDir = APP_PATH self.connect_all() @classmethod def lock_app(cls): '''Блокируем возможность запуска других экземпляров приложения''' f = None try: f = open(cls.LOCK_FILE_PATH, "w") os.fchmod(f.fileno(), 0) except Exception: raise finally: if not f is None: f.close() @classmethod def unlock_app(cls): # Разблокируем возможность запуска приложения if path.exists(cls.LOCK_FILE_PATH): os.remove(cls.LOCK_FILE_PATH) def _get_dir_list(self): '''Получаем список рабочих каталогов''' dirList = [] with open(self.CFG_FILE_PATH) as cfgFile: for line in cfgFile: line = line.decode('utf-8').rstrip() if line: dirList.append(line) return dirList def _save_dir_list(self): '''Сохранение списка рабочих каталогов''' dirList = [dirPath.encode('utf-8') + '\n' for dirPath in self._dirList] with open(self.CFG_FILE_PATH, 'w') as cfgFile: cfgFile.writelines(dirList) def closeEvent(self, event): '''Действия при закрытии приложения''' if not self._activeWorkDir is None: self._activeWorkDir.save_state() self._save_dir_list() self.unlock_app() def connect_all(self): '''Соединяем все слоты с сигналами и назначаем обработчики клавиш виджетам''' self.cboxWorkDirs.currentIndexChanged[int].connect(self.on_change_work_dir) self.lwEntries.currentRowChanged.connect(self.on_select_new_entry) self.btnAddWorkDir.clicked.connect(self.add_work_dir) self.btnRemoveWorkDir.clicked.connect(self.remove_work_dir) self.lwEntries.baseKeyEvent = self.lwEntries.keyPressEvent self.lwEntries.keyPressEvent = self.keyPressEvent_lwEntries self.lwLinks.baseKeyEvent = self.lwLinks.keyPressEvent self.lwLinks.keyPressEvent = self.keyPressEvent_lwLinks def keyPressEvent_lwEntries(self, keyEvent): '''Обработчик нажатий клавиш для виджета lwEntries''' modKeys = QtGui.QApplication.keyboardModifiers() key = keyEvent.key() if (key == Qt.Key_N) and (modKeys & Qt.ControlModifier): # Ctrl + N - добавляем новую ссылку print 'Добавляем новую ссылку на элемент' self.add_link() keyEvent.accept() self.lwEntries.baseKeyEvent(keyEvent) def keyPressEvent_lwLinks(self, keyEvent): modKeys = QtGui.QApplication.keyboardModifiers() key = keyEvent.key() if (key == Qt.Key_N) and (modKeys & Qt.ControlModifier): # Ctrl + N - меняем название ссылки print 'Меняем название ссылки' self.change_link_filename() keyEvent.accept() self.lwLinks.baseKeyEvent(keyEvent) def change_link_filename(self): try: linkItem = self.lwLinks.currentItem() linkPath = unicode(linkItem.text()) splitResult = linkPath.rsplit('.', 1) newFileName, result = QtGui.QInputDialog().getText(self, u'Ввод данных', u'Имя файла:', text=path.basename(linkPath)) if result: newFilePath = path.join(path.dirname(linkPath), unicode(newFileName)) print newFilePath entryItem = self.lwEntries.currentItem() entryName = unicode(entryItem.text()) links = self._activeWorkDir.get_entry_links(entryName) links[links.index(linkPath)] = newFilePath os.rename(linkPath, newFilePath) self.sync_lwLinks(entryName) except Exception as ex: print ex.args def dialog_select_dir(self): dirPath = QtGui.QFileDialog.getExistingDirectory(self, directory=self._activeDialogDir) if not dirPath.isEmpty(): dirPath = unicode(dirPath) if not check_permissions(dirPath, read=True, write=True, execute=True): print u'Недостаточно прав для работы с каталогом "{0}"'.format(dirPath) return None self._activeDialogDir = path.dirname(dirPath) return dirPath return None def add_work_dir(self): # Добавляем новый рабочий каталог dirPath = self.dialog_select_dir() if dirPath is None: return if not dirPath in self._dirList: try: self._dirList.append(dirPath) self.cboxWorkDirs.addItem(dirPath) print u'Добавили рабочий каталог: ', dirPath, type(dirPath) except Exception as ex: print ex.args def remove_work_dir(self): if self._activeWorkDir: dirPath = self._activeWorkDir._path self._activeWorkDir.save_state() self._activeWorkDir = None index = self.cboxWorkDirs.currentIndex() self.cboxWorkDirs.setCurrentIndex(-1) self.cboxWorkDirs.removeItem(index) del self._workDirs[dirPath] print u'Каталог "{0}" удален из списка'.format(dirPath) return True return False def add_link(self): '''Добавление новой ссылки на файл''' try: entryItem = self.lwEntries.currentItem() entryName = unicode(entryItem.text()) linksList = self._activeWorkDir.get_entry_links(entryName, None) if linksList is None: return False srcDir = self._activeWorkDir._path destDir = self.dialog_select_dir() if destDir is None: return False srcPath = path.join(srcDir, entryName) destPath = path.join(destDir, entryName) os.symlink(srcPath, destPath) except Exception as ex: print ex.args return False else: linksList.append(destPath) entryItem.setTextColor(self.ENTRIES_COLORS['work']) if len(linksList) < 2: self.ledNewEntries.setText(unicode(int(self.ledNewEntries.text()) - 1)) self.ledWorkEntries.setText(unicode(int(self.ledWorkEntries.text()) + 1)) print u'Добавлена ссылка "{0}" для "{1}" '.format(destPath, srcPath) self.sync_lwLinks(entryName) return True def clear_counters(self): for counter in [self.ledAllEntries, self.ledNewEntries, self.ledWorkEntries]: counter.clear() def on_change_work_dir(self, index): '''Из списка выбран другой рабочий каталог''' if index == -1: if not self._activeWorkDir is None: self._activeWorkDir.save_state() self._activeWorkDir = None self.lwEntries.clear() self.clear_counters() else: self._activeWorkDir = WorkDir(unicode(self.cboxWorkDirs.itemText(index))) self.sync_lwEntries() print("Изменился текущий рабочий каталог") def on_select_new_entry(self, index): '''Текущим выбран новый файл в рабочем каталоге''' if index == -1: self.lwLinks.clear() else: self.sync_lwLinks(unicode(self.lwEntries.item(index).text())) def sync_cboxWorkDirs(self): '''Синхронизация содержимого виджета со списком рабочих каталогов''' self.cboxWorkDirs.clear() for dirPath in self._dirList: print dirPath self.cboxWorkDirs.addItem(dirPath) self.cboxWorkDirs.setCurrentIndex(-1) # после синхронизации никакой каталог не выбран def sync_lwEntries(self): '''Синхронизация содержимого виджета со списком файлов текущего рабочего каталога''' self.lwEntries.clear() try: workEntries, newEntries, removedEntries = self._activeWorkDir.split_entries() self.ledAllEntries.setText(unicode(len(newEntries) + len(workEntries))) self.ledNewEntries.setText(unicode(len(newEntries))) self.ledWorkEntries.setText(unicode(len(workEntries))) for i, entries in enumerate([newEntries, workEntries, removedEntries]): colorName = self.COLOR_NAMES[i] color = self.ENTRIES_COLORS[colorName] for entry in sorted(entries): entryItem = QtGui.QListWidgetItem(entry, self.lwEntries) entryItem.setTextColor(color) except Exception as ex: print u'Исключени: синхронизация виджета lwEntries не удалась' def sync_lwLinks(self, entry): '''Синхронизация содержимого виджета со списком ссылок текущего выбранного файла''' self.lwLinks.clear() try: for link in self._activeWorkDir.get_entry_links(entry) or [u'[No links...]']: item = QtGui.QListWidgetItem(link, self.lwLinks) except Exception as ex: print u'Исключение: синхронизация виджета lwLinks не удалась'
def install(self, cwd = None): if cwd is None: cwd = self.extractdir with WorkDir(cwd): self.execute([ "make", "install" ])