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', |