Add initial support for git and gitlab
guix-full.manifest
| 25 | 25 | "python-neovim" | |
| 26 | 26 | "python-polib" | |
| 27 | 27 | "python-pyenchant" | |
| 28 | + | "python-pygit2" | |
| 28 | 29 | "python-pyqt" | |
| 29 | 30 | "python-ruamel.yaml" | |
| 30 | 31 | "python-sphinx" |
guix.manifest
| 7 | 7 | "python-lxml" | |
| 8 | 8 | "python-polib" | |
| 9 | 9 | "python-pyenchant" | |
| 10 | + | "python-pygit2" | |
| 10 | 11 | "python-pyqt" | |
| 11 | 12 | "python-ruamel.yaml" | |
| 12 | 13 | "python-sphinx" |
offlate/data.json
| 1 | - | [{"name": "a2ps", "system": 0}, {"name": "aegis", "system": 0}, {"name": "anubis", "system": 0}, {"name": "aspell", "system": 0}, {"name": "bash", "system": 0}, {"name": "bfd", "system": 0}, {"name": "binutils", "system": 0}, {"name": "bison", "system": 0}, {"name": "bison-runtime", "system": 0}, {"name": "buzztrax", "system": 0}, {"name": "ccd2cue", "system": 0}, {"name": "ccide", "system": 0}, {"name": "cflow", "system": 0}, {"name": "clisp", "system": 0}, {"name": "coreutils", "system": 0}, {"name": "cpio", "system": 0}, {"name": "cppi", "system": 0}, {"name": "cpplib", "system": 0}, {"name": "cryptsetup", "system": 0}, {"name": "datamash", "system": 0}, {"name": "denemo", "system": 0}, {"name": "dfarc", "system": 0}, {"name": "dialog", "system": 0}, {"name": "dico", "system": 0}, {"name": "diffutils", "system": 0}, {"name": "dink", "system": 0}, {"name": "direvent", "system": 0}, {"name": "doodle", "system": 0}, {"name": "dos2unix", "system": 0}, {"name": "dos2unix-man", "system": 0}, {"name": "e2fsprogs", "system": 0}, {"name": "enscript", "system": 0}, {"name": "exif", "system": 0}, {"name": "fetchmail", "system": 0}, {"name": "findutils", "system": 0}, {"name": "flex", "system": 0}, {"name": "freedink", "system": 0}, {"name": "fusionforge", "system": 0}, {"name": "gas", "system": 0}, {"name": "gawk", "system": 0}, {"name": "gcal", "system": 0}, {"name": "gcc", "system": 0}, {"name": "gdbm", "system": 0}, {"name": "gettext-examples", "system": 0}, {"name": "gettext-runtime", "system": 0}, {"name": "gettext-tools", "system": 0}, {"name": "gjay", "system": 0}, {"name": "glunarclock", "system": 0}, {"name": "gnubiff", "system": 0}, {"name": "gnubik", "system": 0}, {"name": "gnucash", "system": 0}, {"name": "gnuchess", "system": 0}, {"name": "gnucobol", "system": 0}, {"name": "gnulib", "system": 0}, {"name": "gnunet", "system": 0}, {"name": "gnunet-gtk", "system": 0}, {"name": "gold", "system": 0}, {"name": "gphoto2", "system": 0}, {"name": "gprof", "system": 0}, {"name": "gramadoir", "system": 0}, {"name": "grep", "system": 0}, {"name": "grip", "system": 0}, {"name": "grub", "system": 0}, {"name": "gsasl", "system": 0}, {"name": "gss", "system": 0}, {"name": "gst-plugins-bad", "system": 0}, {"name": "gst-plugins-base", "system": 0}, {"name": "gst-plugins-good", "system": 0}, {"name": "gst-plugins-ugly", "system": 0}, {"name": "gstreamer", "system": 0}, {"name": "gtick", "system": 0}, {"name": "gtkam", "system": 0}, {"name": "gtkspell", "system": 0}, {"name": "guix", "system": 0}, {"name": "guix-manual", "system": 0}, {"name": "guix-packages", "system": 0}, {"name": "gutenprint", "system": 0}, {"name": "hello", "system": 0}, {"name": "help2man", "system": 0}, {"name": "help2man-texi", "system": 0}, {"name": "hylafax", "system": 0}, {"name": "idutils", "system": 0}, {"name": "jwhois", "system": 0}, {"name": "kbd", "system": 0}, {"name": "klavaro", "system": 0}, {"name": "ld", "system": 0}, {"name": "leafpad", "system": 0}, {"name": "libc", "system": 0}, {"name": "libexif", "system": 0}, {"name": "libextractor", "system": 0}, {"name": "libgnutls", "system": 0}, {"name": "libgphoto2", "system": 0}, {"name": "libgphoto2_port", "system": 0}, {"name": "libgsasl", "system": 0}, {"name": "libiconv", "system": 0}, {"name": "libidn", "system": 0}, {"name": "libidn2", "system": 0}, {"name": "lilypond", "system": 0}, {"name": "lordsawar", "system": 0}, {"name": "lprng", "system": 0}, {"name": "lynx", "system": 0}, {"name": "m4", "system": 0}, {"name": "mailfromd", "system": 0}, {"name": "mailutils", "system": 0}, {"name": "make", "system": 0}, {"name": "man-db", "system": 0}, {"name": "man-db-manpages", "system": 0}, {"name": "midi-instruments", "system": 0}, {"name": "minicom", "system": 0}, {"name": "mkisofs", "system": 0}, {"name": "muibase", "system": 0}, {"name": "myserver", "system": 0}, {"name": "nano", "system": 0}, {"name": "opcodes", "system": 0}, {"name": "parted", "system": 0}, {"name": "pies", "system": 0}, {"name": "pnmixer", "system": 0}, {"name": "popt", "system": 0}, {"name": "procps-ng", "system": 0}, {"name": "procps-ng-man", "system": 0}, {"name": "psmisc", "system": 0}, {"name": "pspp", "system": 0}, {"name": "pushover", "system": 0}, {"name": "pwdutils", "system": 0}, {"name": "pyspread", "system": 0}, {"name": "radius", "system": 0}, {"name": "recode", "system": 0}, {"name": "recutils", "system": 0}, {"name": "rpm", "system": 0}, {"name": "rush", "system": 0}, {"name": "sarg", "system": 0}, {"name": "savane", "system": 0}, {"name": "sed", "system": 0}, {"name": "sharutils", "system": 0}, {"name": "shepherd", "system": 0}, {"name": "shishi", "system": 0}, {"name": "skribilo", "system": 0}, {"name": "solfege", "system": 0}, {"name": "solfege-manual", "system": 0}, {"name": "spotmachine", "system": 0}, {"name": "sudo", "system": 0}, {"name": "sudoers", "system": 0}, {"name": "sysstat", "system": 0}, {"name": "tar", "system": 0}, {"name": "texinfo", "system": 0}, {"name": "texinfo_document", "system": 0}, {"name": "tigervnc", "system": 0}, {"name": "tin", "system": 0}, {"name": "tin-man", "system": 0}, {"name": "tracgoogleappsauthplugin", "system": 0}, {"name": "trader", "system": 0}, {"name": "util-linux", "system": 0}, {"name": "ve", "system": 0}, {"name": "vmm", "system": 0}, {"name": "vorbis-tools", "system": 0}, {"name": "wastesedge", "system": 0}, {"name": "wcd", "system": 0}, {"name": "wcd-man", "system": 0}, {"name": "wdiff", "system": 0}, {"name": "wget", "system": 0}, {"name": "wyslij-po", "system": 0}, {"name": "xboard", "system": 0}, {"name": "xdg-user-dirs", "system": 0}, {"name": "xkeyboard-config", "system": 0}, {"name": "id-editor", "system": 1, "organisation": "openstreetmap"}] | |
| 1 | + | [{"name": "a2ps", "system": 0}, {"name": "aegis", "system": 0}, {"name": "anubis", "system": 0}, {"name": "aspell", "system": 0}, {"name": "bash", "system": 0}, {"name": "bfd", "system": 0}, {"name": "binutils", "system": 0}, {"name": "bison", "system": 0}, {"name": "bison-runtime", "system": 0}, {"name": "buzztrax", "system": 0}, {"name": "ccd2cue", "system": 0}, {"name": "ccide", "system": 0}, {"name": "cflow", "system": 0}, {"name": "clisp", "system": 0}, {"name": "coreutils", "system": 0}, {"name": "cpio", "system": 0}, {"name": "cppi", "system": 0}, {"name": "cpplib", "system": 0}, {"name": "cryptsetup", "system": 0}, {"name": "datamash", "system": 0}, {"name": "denemo", "system": 0}, {"name": "dfarc", "system": 0}, {"name": "dialog", "system": 0}, {"name": "dico", "system": 0}, {"name": "diffutils", "system": 0}, {"name": "dink", "system": 0}, {"name": "direvent", "system": 0}, {"name": "doodle", "system": 0}, {"name": "dos2unix", "system": 0}, {"name": "dos2unix-man", "system": 0}, {"name": "e2fsprogs", "system": 0}, {"name": "enscript", "system": 0}, {"name": "exif", "system": 0}, {"name": "fetchmail", "system": 0}, {"name": "findutils", "system": 0}, {"name": "flex", "system": 0}, {"name": "freedink", "system": 0}, {"name": "fusionforge", "system": 0}, {"name": "gas", "system": 0}, {"name": "gawk", "system": 0}, {"name": "gcal", "system": 0}, {"name": "gcc", "system": 0}, {"name": "gdbm", "system": 0}, {"name": "gettext-examples", "system": 0}, {"name": "gettext-runtime", "system": 0}, {"name": "gettext-tools", "system": 0}, {"name": "gjay", "system": 0}, {"name": "glunarclock", "system": 0}, {"name": "gnubiff", "system": 0}, {"name": "gnubik", "system": 0}, {"name": "gnucash", "system": 0}, {"name": "gnuchess", "system": 0}, {"name": "gnucobol", "system": 0}, {"name": "gnulib", "system": 0}, {"name": "gnunet", "system": 0}, {"name": "gnunet-gtk", "system": 0}, {"name": "gold", "system": 0}, {"name": "gphoto2", "system": 0}, {"name": "gprof", "system": 0}, {"name": "gramadoir", "system": 0}, {"name": "grep", "system": 0}, {"name": "grip", "system": 0}, {"name": "grub", "system": 0}, {"name": "gsasl", "system": 0}, {"name": "gss", "system": 0}, {"name": "gst-plugins-bad", "system": 0}, {"name": "gst-plugins-base", "system": 0}, {"name": "gst-plugins-good", "system": 0}, {"name": "gst-plugins-ugly", "system": 0}, {"name": "gstreamer", "system": 0}, {"name": "gtick", "system": 0}, {"name": "gtkam", "system": 0}, {"name": "gtkspell", "system": 0}, {"name": "guix", "system": 0}, {"name": "guix-manual", "system": 0}, {"name": "guix-packages", "system": 0}, {"name": "gutenprint", "system": 0}, {"name": "hello", "system": 0}, {"name": "help2man", "system": 0}, {"name": "help2man-texi", "system": 0}, {"name": "hylafax", "system": 0}, {"name": "idutils", "system": 0}, {"name": "jwhois", "system": 0}, {"name": "kbd", "system": 0}, {"name": "klavaro", "system": 0}, {"name": "ld", "system": 0}, {"name": "leafpad", "system": 0}, {"name": "libc", "system": 0}, {"name": "libexif", "system": 0}, {"name": "libextractor", "system": 0}, {"name": "libgnutls", "system": 0}, {"name": "libgphoto2", "system": 0}, {"name": "libgphoto2_port", "system": 0}, {"name": "libgsasl", "system": 0}, {"name": "libiconv", "system": 0}, {"name": "libidn", "system": 0}, {"name": "libidn2", "system": 0}, {"name": "lilypond", "system": 0}, {"name": "lordsawar", "system": 0}, {"name": "lprng", "system": 0}, {"name": "lynx", "system": 0}, {"name": "m4", "system": 0}, {"name": "mailfromd", "system": 0}, {"name": "mailutils", "system": 0}, {"name": "make", "system": 0}, {"name": "man-db", "system": 0}, {"name": "man-db-manpages", "system": 0}, {"name": "midi-instruments", "system": 0}, {"name": "minicom", "system": 0}, {"name": "mkisofs", "system": 0}, {"name": "muibase", "system": 0}, {"name": "myserver", "system": 0}, {"name": "nano", "system": 0}, {"name": "opcodes", "system": 0}, {"name": "parted", "system": 0}, {"name": "pies", "system": 0}, {"name": "pnmixer", "system": 0}, {"name": "popt", "system": 0}, {"name": "procps-ng", "system": 0}, {"name": "procps-ng-man", "system": 0}, {"name": "psmisc", "system": 0}, {"name": "pspp", "system": 0}, {"name": "pushover", "system": 0}, {"name": "pwdutils", "system": 0}, {"name": "pyspread", "system": 0}, {"name": "radius", "system": 0}, {"name": "recode", "system": 0}, {"name": "recutils", "system": 0}, {"name": "rpm", "system": 0}, {"name": "rush", "system": 0}, {"name": "sarg", "system": 0}, {"name": "savane", "system": 0}, {"name": "sed", "system": 0}, {"name": "sharutils", "system": 0}, {"name": "shepherd", "system": 0}, {"name": "shishi", "system": 0}, {"name": "skribilo", "system": 0}, {"name": "solfege", "system": 0}, {"name": "solfege-manual", "system": 0}, {"name": "spotmachine", "system": 0}, {"name": "sudo", "system": 0}, {"name": "sudoers", "system": 0}, {"name": "sysstat", "system": 0}, {"name": "tar", "system": 0}, {"name": "texinfo", "system": 0}, {"name": "texinfo_document", "system": 0}, {"name": "tigervnc", "system": 0}, {"name": "tin", "system": 0}, {"name": "tin-man", "system": 0}, {"name": "tracgoogleappsauthplugin", "system": 0}, {"name": "trader", "system": 0}, {"name": "util-linux", "system": 0}, {"name": "ve", "system": 0}, {"name": "vmm", "system": 0}, {"name": "vorbis-tools", "system": 0}, {"name": "wastesedge", "system": 0}, {"name": "wcd", "system": 0}, {"name": "wcd-man", "system": 0}, {"name": "wdiff", "system": 0}, {"name": "wget", "system": 0}, {"name": "wyslij-po", "system": 0}, {"name": "xboard", "system": 0}, {"name": "xdg-user-dirs", "system": 0}, {"name": "xkeyboard-config", "system": 0}, {"name": "id-editor", "system": 1, "organisation": "openstreetmap"}, {"name": "offlate", "system": 2, "site": "https://framagit.org", "project": "tyreunom/offlate", "format": 2, "locations": ["offlate/locales/offlate_%l.ts"]}] |
offlate/formats/list.py unknown status 1
| 1 | + | # Copyright (c) 2018 Julien Lepiller <julien@lepiller.eu> | |
| 2 | + | # | |
| 3 | + | # This program is free software: you can redistribute it and/or modify | |
| 4 | + | # it under the terms of the GNU Affero General Public License as | |
| 5 | + | # published by the Free Software Foundation, either version 3 of the | |
| 6 | + | # License, or (at your option) any later version. | |
| 7 | + | # | |
| 8 | + | # This program is distributed in the hope that it will be useful, | |
| 9 | + | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 10 | + | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 11 | + | # GNU Affero General Public License for more details. | |
| 12 | + | # | |
| 13 | + | # You should have received a copy of the GNU Affero General Public License | |
| 14 | + | # along with this program. If not, see <https://www.gnu.org/licenses/>. | |
| 15 | + | #### | |
| 16 | + | """ The list of available formats. """ | |
| 17 | + | ||
| 18 | + | GETTEXT = 0 | |
| 19 | + | YAML = 1 | |
| 20 | + | ||
| 21 | + | format_list = [ | |
| 22 | + | "Gettext (.po)", | |
| 23 | + | "YAML (.yml)", | |
| 24 | + | "Qt (.ts)" | |
| 25 | + | ] |
offlate/manager.py
| 17 | 17 | from pathlib import Path | |
| 18 | 18 | from .systems.tp import TPProject | |
| 19 | 19 | from .systems.transifex import TransifexProject | |
| 20 | + | from .systems.gitlab import GitlabProject | |
| 20 | 21 | from .formats.formatException import UnsupportedFormatException | |
| 22 | + | from .systems.list import * | |
| 21 | 23 | ||
| 22 | 24 | import json | |
| 23 | 25 | import os | |
… | |||
| 62 | 64 | with open(self.basedir + '/projects.json') as f: | |
| 63 | 65 | self.projects = json.load(f) | |
| 64 | 66 | for p in self.projects: | |
| 65 | - | if p['system'] == 0: | |
| 67 | + | if p['system'] == TRANSLATION_PROJECT: | |
| 66 | 68 | if not "TP" in self.settings.conf: | |
| 67 | 69 | self.settings.conf["TP"] = {} | |
| 68 | 70 | self.project_list[p['name']] = \ | |
| 69 | 71 | TPProject(self.settings.conf["TP"], p['name'], p['lang'], p['info']) | |
| 70 | 72 | self.project_list[p['name']].open(self.basedir+'/'+p['name']) | |
| 71 | - | if p['system'] == 1: | |
| 73 | + | if p['system'] == TRANSIFEX: | |
| 72 | 74 | if not "Transifex" in self.settings.conf: | |
| 73 | 75 | self.settings.conf['Transifex'] = {} | |
| 74 | 76 | self.project_list[p['name']] = \ | |
| 75 | 77 | TransifexProject(self.settings.conf['Transifex'], p['name'], p['lang'], p['info']) | |
| 76 | 78 | self.project_list[p['name']].open(self.basedir+'/'+p['name']) | |
| 79 | + | if p['system'] == GITLAB: | |
| 80 | + | if not "Gitlab" in self.settings.conf: | |
| 81 | + | self.settings.conf['Gitlab'] = {} | |
| 82 | + | self.project_list[p['name']] = \ | |
| 83 | + | GitlabProject(self.settings.conf['Gitlab'], p['name'], p['lang'], p['info']) | |
| 84 | + | self.project_list[p['name']].open(self.basedir+'/'+p['name']) | |
| 77 | 85 | except Exception as e: | |
| 78 | 86 | print(e) | |
| 79 | 87 | with open(self.basedir + '/projects.json', 'w') as f: | |
… | |||
| 83 | 91 | projectpath = self.basedir + '/' + name | |
| 84 | 92 | Path(projectpath).mkdir(parents=True) | |
| 85 | 93 | try: | |
| 86 | - | if system == 0: #TP | |
| 94 | + | if system == TRANSLATION_PROJECT: | |
| 87 | 95 | if not "TP" in self.settings.conf: | |
| 88 | 96 | self.settings.conf["TP"] = {} | |
| 89 | 97 | proj = TPProject(self.settings.conf["TP"], name, lang) | |
… | |||
| 91 | 99 | self.project_list[name] = proj | |
| 92 | 100 | self.projects.append({"name": name, "lang": lang, "system": system, | |
| 93 | 101 | "info": {"version": proj.version}}) | |
| 94 | - | if system == 1: #Transifex | |
| 102 | + | if system == TRANSIFEX: | |
| 95 | 103 | if not 'Transifex' in self.settings.conf: | |
| 96 | 104 | self.settings.conf['Transifex'] = {} | |
| 97 | 105 | proj = TransifexProject(self.settings.conf['Transifex'], name, lang, data) | |
… | |||
| 99 | 107 | self.project_list[name] = proj | |
| 100 | 108 | self.projects.append({"name": name, "lang": lang, "system": system, | |
| 101 | 109 | "info": data}) | |
| 110 | + | if system == GITLAB: | |
| 111 | + | if not 'Gitlab' in self.settings.conf: | |
| 112 | + | self.settings.conf['Gitlab'] = {} | |
| 113 | + | proj = GitlabProject(self.settings.conf['Gitlab'], name, lang, data) | |
| 114 | + | proj.initialize(projectpath) | |
| 115 | + | self.project_list[name] = proj | |
| 116 | + | self.projects.append({"name": name, "lang": lang, "system": system, | |
| 117 | + | "info": data}) | |
| 102 | 118 | except UnsupportedFormatException: | |
| 103 | 119 | rmdir(projectpath) | |
| 104 | 120 | self.writeProjects() | |
offlate/multiplelineedit.py unknown status 1
| 1 | + | # Copyright (c) 2018 Julien Lepiller <julien@lepiller.eu> | |
| 2 | + | # | |
| 3 | + | # This program is free software: you can redistribute it and/or modify | |
| 4 | + | # it under the terms of the GNU Affero General Public License as | |
| 5 | + | # published by the Free Software Foundation, either version 3 of the | |
| 6 | + | # License, or (at your option) any later version. | |
| 7 | + | # | |
| 8 | + | # This program is distributed in the hope that it will be useful, | |
| 9 | + | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 10 | + | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 11 | + | # GNU Affero General Public License for more details. | |
| 12 | + | # | |
| 13 | + | # You should have received a copy of the GNU Affero General Public License | |
| 14 | + | # along with this program. If not, see <https://www.gnu.org/licenses/>. | |
| 15 | + | #### | |
| 16 | + | ||
| 17 | + | from PyQt5.QtWidgets import * | |
| 18 | + | from PyQt5.QtGui import * | |
| 19 | + | from PyQt5.QtCore import * | |
| 20 | + | ||
| 21 | + | class MultipleLineEdit(QWidget): | |
| 22 | + | textChanged = pyqtSignal() | |
| 23 | + | ||
| 24 | + | def __init__(self, parent = None): | |
| 25 | + | super(MultipleLineEdit, self).__init__(parent) | |
| 26 | + | self.initUI() | |
| 27 | + | ||
| 28 | + | def setText(self, texts): | |
| 29 | + | self.treeWidget.clear() | |
| 30 | + | items = [] | |
| 31 | + | for text in texts: | |
| 32 | + | item = QTreeWidgetItem([text]) | |
| 33 | + | items.append(item) | |
| 34 | + | self.treeWidget.insertTopLevelItems(0, items) | |
| 35 | + | ||
| 36 | + | def addLine(self, args): | |
| 37 | + | text = self.newtext.text() | |
| 38 | + | items = [QTreeWidgetItem([text])] | |
| 39 | + | self.treeWidget.insertTopLevelItems(0, items) | |
| 40 | + | ||
| 41 | + | def deleteLine(self, args): | |
| 42 | + | self.treeWidget.takeTopLevelItem(self.treeWidget.currentIndex().row()) | |
| 43 | + | ||
| 44 | + | def content(self): | |
| 45 | + | number = self.treeWidget.topLevelItemCount() | |
| 46 | + | items = [] | |
| 47 | + | for i in range(0, number): | |
| 48 | + | items.append(self.treeWidget.topLevelItem(i).text(0)) | |
| 49 | + | return items | |
| 50 | + | ||
| 51 | + | def initUI(self): | |
| 52 | + | vbox = QVBoxLayout() | |
| 53 | + | hbox = QHBoxLayout() | |
| 54 | + | self.setLayout(vbox) | |
| 55 | + | self.treeWidget = QTreeWidget() | |
| 56 | + | self.treeWidget.setColumnCount(1) | |
| 57 | + | vbox.addWidget(self.treeWidget) | |
| 58 | + | self.newtext = QLineEdit() | |
| 59 | + | addbutton = QPushButton(self.tr("Add")) | |
| 60 | + | addbutton.clicked.connect(self.addLine) | |
| 61 | + | removebutton = QPushButton(self.tr("Remove")) | |
| 62 | + | removebutton.clicked.connect(self.deleteLine, 0) | |
| 63 | + | hbox.addWidget(self.newtext) | |
| 64 | + | hbox.addWidget(addbutton) | |
| 65 | + | hbox.addWidget(removebutton) | |
| 66 | + | vbox.addLayout(hbox) |
offlate/systems/git.py unknown status 1
| 1 | + | # Copyright (c) 2018 Julien Lepiller <julien@lepiller.eu> | |
| 2 | + | # | |
| 3 | + | # This program is free software: you can redistribute it and/or modify | |
| 4 | + | # it under the terms of the GNU Affero General Public License as | |
| 5 | + | # published by the Free Software Foundation, either version 3 of the | |
| 6 | + | # License, or (at your option) any later version. | |
| 7 | + | # | |
| 8 | + | # This program is distributed in the hope that it will be useful, | |
| 9 | + | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 10 | + | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 11 | + | # GNU Affero General Public License for more details. | |
| 12 | + | # | |
| 13 | + | # You should have received a copy of the GNU Affero General Public License | |
| 14 | + | # along with this program. If not, see <https://www.gnu.org/licenses/>. | |
| 15 | + | #### | |
| 16 | + | """ The git abstract system connector. """ | |
| 17 | + | ||
| 18 | + | import pygit2 | |
| 19 | + | from os import rename, remove | |
| 20 | + | ||
| 21 | + | class Progress(pygit2.remote.RemoteCallbacks): | |
| 22 | + | def transfer_progress(self, stats): | |
| 23 | + | try: | |
| 24 | + | print("{}/{}\r".format(stats.received_objects, stats.total_objects), file=sys.stderr, end='') | |
| 25 | + | except: | |
| 26 | + | pass | |
| 27 | + | ||
| 28 | + | class GitProject: | |
| 29 | + | def __init__(self, conf, name, lang, data = {}): | |
| 30 | + | self.conf = conf | |
| 31 | + | self.name = name | |
| 32 | + | self.lang = lang | |
| 33 | + | self.data = data | |
| 34 | + | ||
| 35 | + | def open(self, basedir): | |
| 36 | + | self.basedir = basedir | |
| 37 | + | self.updateURI() | |
| 38 | + | ||
| 39 | + | def initialize(self, basedir): | |
| 40 | + | self.basedir = basedir | |
| 41 | + | self.updateURI() | |
| 42 | + | self.clone(basedir + "/current") | |
| 43 | + | ||
| 44 | + | def updateURI(self): | |
| 45 | + | raise Exception("Unimplemented method in concrete class: updateURI") | |
| 46 | + | ||
| 47 | + | def clone(self, directory): | |
| 48 | + | print("Cloning {} in {}".format(self.uri, directory)) | |
| 49 | + | pygit2.clone_repository(self.uri, directory, callbacks=Progress()) | |
| 50 | + | ||
| 51 | + | def update(self, callback): | |
| 52 | + | os.rename(self.basedir + "/current", self.basedir + "/old") | |
| 53 | + | self.clone(self.basedir + "/current") | |
| 54 | + | # TODO: merge | |
| 55 | + | os.remove(self.basedir + "/old") | |
| 56 | + | ||
| 57 | + | def send(self, interface): | |
| 58 | + | pass | |
| 59 | + | ||
| 60 | + | def save(self): | |
| 61 | + | pass | |
| 62 | + | ||
| 63 | + | def content(self): | |
| 64 | + | return {'default': []} |
offlate/systems/gitlab.py unknown status 1
| 1 | + | # Copyright (c) 2018 Julien Lepiller <julien@lepiller.eu> | |
| 2 | + | # | |
| 3 | + | # This program is free software: you can redistribute it and/or modify | |
| 4 | + | # it under the terms of the GNU Affero General Public License as | |
| 5 | + | # published by the Free Software Foundation, either version 3 of the | |
| 6 | + | # License, or (at your option) any later version. | |
| 7 | + | # | |
| 8 | + | # This program is distributed in the hope that it will be useful, | |
| 9 | + | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 10 | + | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 11 | + | # GNU Affero General Public License for more details. | |
| 12 | + | # | |
| 13 | + | # You should have received a copy of the GNU Affero General Public License | |
| 14 | + | # along with this program. If not, see <https://www.gnu.org/licenses/>. | |
| 15 | + | #### | |
| 16 | + | """ The gitlab system connector. """ | |
| 17 | + | ||
| 18 | + | from .git import GitProject | |
| 19 | + | ||
| 20 | + | class GitlabProject(GitProject): | |
| 21 | + | def __init__(self, conf, name, lang, data = {}): | |
| 22 | + | GitProject.__init__(self, conf, name, lang, data) | |
| 23 | + | ||
| 24 | + | def updateURI(self): | |
| 25 | + | self.uri = self.data['site'] + "/" + self.data['project'] + ".git" |
offlate/systems/list.py unknown status 1
| 1 | + | # Copyright (c) 2018 Julien Lepiller <julien@lepiller.eu> | |
| 2 | + | # | |
| 3 | + | # This program is free software: you can redistribute it and/or modify | |
| 4 | + | # it under the terms of the GNU Affero General Public License as | |
| 5 | + | # published by the Free Software Foundation, either version 3 of the | |
| 6 | + | # License, or (at your option) any later version. | |
| 7 | + | # | |
| 8 | + | # This program is distributed in the hope that it will be useful, | |
| 9 | + | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 10 | + | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 11 | + | # GNU Affero General Public License for more details. | |
| 12 | + | # | |
| 13 | + | # You should have received a copy of the GNU Affero General Public License | |
| 14 | + | # along with this program. If not, see <https://www.gnu.org/licenses/>. | |
| 15 | + | #### | |
| 16 | + | """ The listo of system connectors. """ | |
| 17 | + | ||
| 18 | + | TRANSLATION_PROJECT = 0 | |
| 19 | + | TRANSIFEX = 1 | |
| 20 | + | GITLAB = 2 |
offlate/window.py
| 28 | 28 | from .manager import ProjectManager | |
| 29 | 29 | from .spellcheckedit import SpellCheckEdit | |
| 30 | 30 | from .tagclickedit import TagClickEdit | |
| 31 | + | from .multiplelineedit import MultipleLineEdit | |
| 32 | + | ||
| 33 | + | from .systems.list import * | |
| 34 | + | from .formats.list import * | |
| 31 | 35 | ||
| 32 | 36 | class ProjectTab(QTabWidget): | |
| 33 | 37 | def __init__(self, parent = None): | |
… | |||
| 305 | 309 | self.combo = QComboBox() | |
| 306 | 310 | self.combo.addItem(self.tr("The Translation Project")) | |
| 307 | 311 | self.combo.addItem(self.tr("Transifex")) | |
| 312 | + | self.combo.addItem(self.tr("Gitlab")) | |
| 308 | 313 | self.formLayout.addRow(self.combo) | |
| 309 | 314 | ||
| 310 | 315 | self.nameWidget.textChanged.connect(self.modify) | |
… | |||
| 324 | 329 | self.additionalFields = [] | |
| 325 | 330 | self.additionalFields.append([]) | |
| 326 | 331 | self.additionalFields.append([]) | |
| 332 | + | self.additionalFields.append([]) | |
| 333 | + | ||
| 334 | + | # Transifex | |
| 327 | 335 | self.transifexOrganisation = QLineEdit() | |
| 328 | 336 | self.transifexOrganisation.textChanged.connect(self.modify) | |
| 329 | 337 | transifexOrganisationLabel = QLabel(self.tr("Organization")) | |
| 330 | - | self.additionalFields[1].append({'label': transifexOrganisationLabel, | |
| 338 | + | self.additionalFields[TRANSIFEX].append({'label': transifexOrganisationLabel, | |
| 331 | 339 | 'widget': self.transifexOrganisation}) | |
| 332 | 340 | ||
| 341 | + | # Gitlab | |
| 342 | + | self.gitlabSite = QLineEdit() | |
| 343 | + | self.gitlabSite.textChanged.connect(self.modify) | |
| 344 | + | gitlabSiteLabel = QLabel(self.tr('hosting website')) | |
| 345 | + | self.additionalFields[GITLAB].append({'label': gitlabSiteLabel, | |
| 346 | + | 'widget': self.gitlabSite}) | |
| 347 | + | self.gitlabProject = QLineEdit() | |
| 348 | + | self.gitlabProject.textChanged.connect(self.modify) | |
| 349 | + | gitlabProjectLabel = QLabel(self.tr('project part')) | |
| 350 | + | self.additionalFields[GITLAB].append({'label': gitlabProjectLabel, | |
| 351 | + | 'widget': self.gitlabProject}) | |
| 352 | + | self.gitlabFileTypeCombo = QComboBox() | |
| 353 | + | self.gitlabFileTypeCombo.addItem(format_list[0]) | |
| 354 | + | self.gitlabFileTypeCombo.addItem(format_list[1]) | |
| 355 | + | self.gitlabFileTypeCombo.addItem(format_list[2]) | |
| 356 | + | self.gitlabFileTypeCombo.currentIndexChanged.connect(self.modify) | |
| 357 | + | gitlabFileTypeLabel = QLabel(self.tr('Translation type')) | |
| 358 | + | self.additionalFields[GITLAB].append({'label': gitlabFileTypeLabel, | |
| 359 | + | 'widget': self.gitlabFileTypeCombo}) | |
| 360 | + | self.gitlabLocations = MultipleLineEdit() | |
| 361 | + | self.gitlabLocations.textChanged.connect(self.modify) | |
| 362 | + | gitlabLocationsLabel = QLabel(self.tr('Locations')) | |
| 363 | + | self.additionalFields[GITLAB].append({'label': gitlabLocationsLabel, | |
| 364 | + | 'widget': self.gitlabLocations}) | |
| 365 | + | ||
| 333 | 366 | self.setLayout(hbox) | |
| 334 | 367 | ||
| 335 | 368 | self.predefinedprojects.currentItemChanged.connect(self.fill) | |
… | |||
| 347 | 380 | data = item.data(Qt.UserRole) | |
| 348 | 381 | self.nameWidget.setText(data['name']) | |
| 349 | 382 | self.combo.setCurrentIndex(int(data['system'])) | |
| 350 | - | if data['system'] == 1: | |
| 383 | + | if data['system'] == TRANSIFEX: | |
| 351 | 384 | self.transifexOrganisation.setText(data['organisation']) | |
| 385 | + | if data['system'] == GITLAB: | |
| 386 | + | self.gitlabSite.setText(data['site']) | |
| 387 | + | self.gitlabProject.setText(data['project']) | |
| 388 | + | self.gitlabFileTypeCombo.setCurrentIndex(data['format']) | |
| 389 | + | self.gitlabLocations.setText(data['locations']) | |
| 352 | 390 | ||
| 353 | 391 | def filter(self): | |
| 354 | 392 | search = self.searchfield.text() | |
… | |||
| 365 | 403 | if self.nameWidget.text() != '' and self.langWidget.text() != '': | |
| 366 | 404 | enable = True | |
| 367 | 405 | for widget in self.additionalFields[self.combo.currentIndex()]: | |
| 368 | - | if widget['widget'].text() == '': | |
| 406 | + | if isinstance(widget['widget'], QLineEdit) and widget['widget'].text() == '': | |
| 369 | 407 | enable = False | |
| 370 | 408 | break | |
| 371 | 409 | self.okbutton.setEnabled(enable) | |
… | |||
| 383 | 421 | return self.combo.currentIndex() | |
| 384 | 422 | ||
| 385 | 423 | def getProjectInfo(self): | |
| 386 | - | if self.getProjectSystem() == 0: | |
| 424 | + | if self.getProjectSystem() == TRANSLATION_PROJECT: | |
| 387 | 425 | return {} | |
| 388 | - | if self.getProjectSystem() == 1: | |
| 389 | - | return {'organization': self.additionalFields[1][0]['widget'].text()} | |
| 426 | + | if self.getProjectSystem() == TRANSIFEX: | |
| 427 | + | return {'organization': self.additionalFields[TRANSIFEX][0]['widget'].text()} | |
| 428 | + | if self.getProjectSystem() == GITLAB: | |
| 429 | + | return {'site': self.additionalFields[GITLAB][0]['widget'].text(), | |
| 430 | + | 'project': self.additionalFields[GITLAB][1]['widget'].text(), | |
| 431 | + | 'format': self.additionalFields[GITLAB][2]['widget'].currentIndex(), | |
| 432 | + | 'locations': self.additionalFields[GITLAB][3]['widget'].content()} | |
| 390 | 433 | return {} | |
| 391 | 434 | ||
| 392 | 435 | def othersystem(self): | |
setup.py
| 12 | 12 | version="0.2.0", | |
| 13 | 13 | packages=find_packages(exclude=['.guix-profile*']), | |
| 14 | 14 | python_requires = '>=3', | |
| 15 | - | install_requires=['polib', 'ruamel.yaml', 'python-dateutil', 'PyQt5'], | |
| 15 | + | install_requires=['polib', 'ruamel.yaml', 'python-dateutil', 'PyQt5', 'pygit2'], | |
| 16 | 16 | entry_points={ | |
| 17 | 17 | 'gui_scripts': [ | |
| 18 | 18 | 'offlate=offlate.window:main', |