* [bug#32856] [PATCH] gnu: grammalecte: Update source hash.
@ 2018-09-27 19:01 Pierre-Antoine Rouby
2018-09-27 19:23 ` Tobias Geerinckx-Rice
0 siblings, 1 reply; 7+ messages in thread
From: Pierre-Antoine Rouby @ 2018-09-27 19:01 UTC (permalink / raw)
To: 32856; +Cc: Pierre-Antoine Rouby
* gnu/packages/dictionaries.scm (grammalecte): Update source hash.
---
gnu/packages/dictionaries.scm | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/gnu/packages/dictionaries.scm b/gnu/packages/dictionaries.scm
index 9f63223..ce7ef1c 100644
--- a/gnu/packages/dictionaries.scm
+++ b/gnu/packages/dictionaries.scm
@@ -4,6 +4,7 @@
;;; Copyright © 2016 Sou Bunnbu <iyzsong@gmail.com>
;;; Copyright © 2017, 2018 Nicolas Goaziou <mail@nicolasgoaziou.fr>
;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2018 Pierre-Antoine Rouby <contact@parouby.fr>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -219,7 +220,7 @@ It comes with a German-English dictionary with approximately 270,000 entries.")
"Grammalecte-fr-v" version ".zip"))
(sha256
(base32
- "1flsahqw2r0cmg0bixpl5w0acricmdh2cf4lf9zr66ydgmjnmv2s"))))
+ "11byjs3ggdhia5f4vyfqfvbbczsfqimll98h98g7hlsrm7vrifb0"))))
(build-system python-build-system)
(home-page "https://www.dicollecte.org")
(synopsis "French spelling and grammar checker")
--
2.7.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [bug#32856] [PATCH] gnu: grammalecte: Update source hash.
2018-09-27 19:01 [bug#32856] [PATCH] gnu: grammalecte: Update source hash Pierre-Antoine Rouby
@ 2018-09-27 19:23 ` Tobias Geerinckx-Rice
2018-09-27 19:34 ` Tobias Geerinckx-Rice
2018-09-28 7:04 ` parouby
0 siblings, 2 replies; 7+ messages in thread
From: Tobias Geerinckx-Rice @ 2018-09-27 19:23 UTC (permalink / raw)
To: Pierre-Antoine Rouby; +Cc: 32856
Bonjour,
Pierre-Antoine Rouby wrote:
> * gnu/packages/dictionaries.scm (grammalecte): Update source
> hash.
This is a bit too... intriguing :-) IMO we should always explain
what changed & (when possible) why.
Were the exact same files recompressed with a non-deterministic
compressor? Did someone fix a typo hoping that nobody'd notice?
'diffoscope' is a great tool for such questions (and it's in
Guix).
Kind regards,
T G-R
^ permalink raw reply [flat|nested] 7+ messages in thread
* [bug#32856] [PATCH] gnu: grammalecte: Update source hash.
2018-09-27 19:23 ` Tobias Geerinckx-Rice
@ 2018-09-27 19:34 ` Tobias Geerinckx-Rice
2018-09-30 20:12 ` Ludovic Courtès
2018-09-28 7:04 ` parouby
1 sibling, 1 reply; 7+ messages in thread
From: Tobias Geerinckx-Rice @ 2018-09-27 19:34 UTC (permalink / raw)
To: 32856
[-- Attachment #1: Type: text/plain, Size: 193 bytes --]
Tobias Geerinckx-Rice wrote:
> This is a bit too... intriguing :-) IMO we should always explain
> what
> changed & (when possible) why.
Diffoscope output attached. It is... non-trivial. :-(
[-- Attachment #2: Grammalecte-fr-v0.6.5.zip-sneaky-update.diffoscope --]
[-- Type: application/octet-stream, Size: 36097 bytes --]
--- x5w28kgf3d7jpvqmfgqna19v96gp8wga-zipbomb-Grammalecte-fr-v0.6.5.zip
+++ Grammalecte-fr-v0.6.5.zip
├── zipinfo /dev/stdin
│ @@ -1,47 +1,45 @@
│ -Zip file size: 3123127 bytes, number of entries: 45
│ --rw-rw-rw- 2.0 fat 3246 b- defN 18-Jul-06 14:12 grammalecte/grammar_checker.py
│ --rw-rw-rw- 2.0 fat 314 b- defN 18-Jul-06 14:12 grammalecte/README.txt
│ --rw-rw-rw- 2.0 fat 5121 b- defN 18-Jul-06 14:12 grammalecte/text.py
│ --rw-rw-rw- 2.0 fat 76 b- defN 18-Jul-06 14:12 grammalecte/WARNING.txt
│ --rw-rw-rw- 2.0 fat 32 b- defN 18-Jul-06 14:12 grammalecte/__init__.py
│ --rw-rw-rw- 2.0 fat 10597 b- defN 18-Jul-05 14:16 grammalecte/graphspell/char_player.py
│ --rw-rw-rw- 2.0 fat 36657 b- defN 18-Jul-05 14:16 grammalecte/graphspell/dawg.py
│ --rw-rw-rw- 2.0 fat 1197 b- defN 18-Jul-05 14:16 grammalecte/graphspell/echo.py
│ --rw-rw-rw- 2.0 fat 37901 b- defN 18-Jul-05 14:44 grammalecte/graphspell/ibdawg.py
│ --rw-rw-rw- 2.0 fat 4359 b- defN 18-Jul-05 14:16 grammalecte/graphspell/keyboard_chars_proximity.py
│ --rw-rw-rw- 2.0 fat 1046 b- defN 18-Jul-05 14:16 grammalecte/graphspell/progressbar.py
│ --rw-rw-rw- 2.0 fat 8934 b- defN 18-Jul-05 14:16 grammalecte/graphspell/spellchecker.py
│ --rw-rw-rw- 2.0 fat 6548 b- defN 18-Jul-05 14:16 grammalecte/graphspell/str_transform.py
│ --rw-rw-rw- 2.0 fat 2146 b- defN 18-Jul-05 14:16 grammalecte/graphspell/tokenizer.py
│ --rw-rw-rw- 2.0 fat 29 b- defN 18-Jul-05 14:16 grammalecte/graphspell/__init__.py
│ +Zip file size: 3122063 bytes, number of entries: 43
│ +-rw-rw-rw- 2.0 fat 150112 b- defN 18-Jul-07 15:08 grammalecte/bottle.py
│ +-rw-rw-rw- 2.0 fat 3246 b- defN 18-Jul-07 18:00 grammalecte/grammar_checker.py
│ +-rw-rw-rw- 2.0 fat 314 b- defN 18-Jul-07 18:00 grammalecte/README.txt
│ +-rw-rw-rw- 2.0 fat 5121 b- defN 18-Jul-07 18:00 grammalecte/text.py
│ +-rw-rw-rw- 2.0 fat 76 b- defN 18-Jul-07 18:00 grammalecte/WARNING.txt
│ +-rw-rw-rw- 2.0 fat 32 b- defN 18-Jul-07 18:00 grammalecte/__init__.py
│ +-rw-rw-rw- 2.0 fat 10597 b- defN 18-Jul-07 15:08 grammalecte/graphspell/char_player.py
│ +-rw-rw-rw- 2.0 fat 36657 b- defN 18-Jul-07 15:08 grammalecte/graphspell/dawg.py
│ +-rw-rw-rw- 2.0 fat 1197 b- defN 18-Jul-07 15:08 grammalecte/graphspell/echo.py
│ +-rw-rw-rw- 2.0 fat 37901 b- defN 18-Jul-07 15:08 grammalecte/graphspell/ibdawg.py
│ +-rw-rw-rw- 2.0 fat 4359 b- defN 18-Jul-07 15:08 grammalecte/graphspell/keyboard_chars_proximity.py
│ +-rw-rw-rw- 2.0 fat 1046 b- defN 18-Jul-07 15:08 grammalecte/graphspell/progressbar.py
│ +-rw-rw-rw- 2.0 fat 8934 b- defN 18-Jul-07 15:08 grammalecte/graphspell/spellchecker.py
│ +-rw-rw-rw- 2.0 fat 6548 b- defN 18-Jul-07 15:08 grammalecte/graphspell/str_transform.py
│ +-rw-rw-rw- 2.0 fat 2146 b- defN 18-Jul-07 15:08 grammalecte/graphspell/tokenizer.py
│ +-rw-rw-rw- 2.0 fat 29 b- defN 18-Jul-07 15:08 grammalecte/graphspell/__init__.py
│ -rw-rw-rw- 2.0 fat 1701245 b- defN 18-Jul-01 20:46 grammalecte/graphspell/_dictionaries/fr-allvars.bdic
│ -rw-rw-rw- 2.0 fat 1335891 b- defN 18-Jul-01 20:47 grammalecte/graphspell/_dictionaries/fr-classic.bdic
│ -rw-rw-rw- 2.0 fat 1300164 b- defN 18-Jul-01 20:48 grammalecte/graphspell/_dictionaries/fr-reform.bdic
│ --rw-rw-rw- 2.0 fat 18544 b- defN 18-Jul-06 14:12 grammalecte/fr/conj.py
│ --rw-rw-rw- 2.0 fat 237251 b- defN 18-Jul-06 14:12 grammalecte/fr/conj_data.py
│ --rw-rw-rw- 2.0 fat 126992 b- defN 18-Jul-06 14:12 grammalecte/fr/conj_generator.py
│ --rw-rw-rw- 2.0 fat 5447 b- defN 18-Jul-06 14:12 grammalecte/fr/cregex.py
│ --rw-rw-rw- 2.0 fat 358951 b- defN 18-Jul-06 14:12 grammalecte/fr/gc_engine.py
│ --rw-rw-rw- 2.0 fat 9416 b- defN 18-Jul-06 14:12 grammalecte/fr/gc_options.py
│ --rw-rw-rw- 2.0 fat 514629 b- defN 18-Jul-06 14:12 grammalecte/fr/gc_rules.py
│ --rw-rw-rw- 2.0 fat 575772 b- defN 18-Jul-06 14:12 grammalecte/fr/gc_test.txt
│ --rw-rw-rw- 2.0 fat 10076 b- defN 18-Jul-06 14:12 grammalecte/fr/lexicographe.py
│ --rw-rw-rw- 2.0 fat 22710 b- defN 18-Jul-06 14:12 grammalecte/fr/locutions_data.py
│ --rw-rw-rw- 2.0 fat 1558 b- defN 18-Jul-06 14:12 grammalecte/fr/mfsp.py
│ --rw-rw-rw- 2.0 fat 197303 b- defN 18-Jul-06 14:12 grammalecte/fr/mfsp_data.py
│ --rw-rw-rw- 2.0 fat 70905 b- defN 18-Jul-06 14:12 grammalecte/fr/perf.txt
│ --rw-rw-rw- 2.0 fat 1514 b- defN 18-Jul-06 14:12 grammalecte/fr/phonet.py
│ --rw-rw-rw- 2.0 fat 357572 b- defN 18-Jul-06 14:12 grammalecte/fr/phonet_data.py
│ --rw-rw-rw- 2.0 fat 8678 b- defN 18-Jul-06 14:12 grammalecte/fr/tests.py
│ --rw-rw-rw- 2.0 fat 14413 b- defN 18-Jul-06 14:12 grammalecte/fr/textformatter.py
│ --rw-rw-rw- 2.0 fat 26 b- defN 18-Jul-06 14:12 grammalecte/fr/__init__.py
│ --rw-rw-rw- 2.0 fat 12503 b- defN 18-Jul-05 14:16 grammalecte-cli.py
│ --rw-rw-rw- 2.0 fat 9830 b- defN 18-Jul-05 14:16 grammalecte-server.py
│ --rw-rw-rw- 2.0 fat 150112 b- defN 18-Jul-05 14:16 bottle.py
│ --rw-rw-rw- 2.0 fat 124 b- defN 18-Jul-05 14:16 grammalecte-server-options._global.ini
│ --rw-rw-rw- 2.0 fat 1304 b- defN 18-Jul-06 14:13 grammalecte-server-options.fr.ini
│ --rw-rw-rw- 2.0 fat 290 b- defN 18-Jul-05 14:16 README.txt
│ --rw-rw-rw- 2.0 fat 35147 b- defN 18-Jul-05 14:16 LICENSE.txt
│ --rw-rw-rw- 2.0 fat 47748 b- defN 18-Jul-05 14:16 LICENSE.fr.txt
│ -?rw------- 2.0 fat 4229 b- defN 18-Jul-06 14:13 setup.py
│ -45 files, 7248547 bytes uncompressed, 3117135 bytes compressed: 57.0%
│ +-rw-rw-rw- 2.0 fat 18544 b- defN 18-Jul-07 18:00 grammalecte/fr/conj.py
│ +-rw-rw-rw- 2.0 fat 237251 b- defN 18-Jul-07 18:00 grammalecte/fr/conj_data.py
│ +-rw-rw-rw- 2.0 fat 126992 b- defN 18-Jul-07 18:00 grammalecte/fr/conj_generator.py
│ +-rw-rw-rw- 2.0 fat 5447 b- defN 18-Jul-07 18:00 grammalecte/fr/cregex.py
│ +-rw-rw-rw- 2.0 fat 358951 b- defN 18-Jul-07 18:00 grammalecte/fr/gc_engine.py
│ +-rw-rw-rw- 2.0 fat 9414 b- defN 18-Jul-07 18:00 grammalecte/fr/gc_options.py
│ +-rw-rw-rw- 2.0 fat 514629 b- defN 18-Jul-07 18:00 grammalecte/fr/gc_rules.py
│ +-rw-rw-rw- 2.0 fat 575772 b- defN 18-Jul-07 18:00 grammalecte/fr/gc_test.txt
│ +-rw-rw-rw- 2.0 fat 10076 b- defN 18-Jul-07 18:00 grammalecte/fr/lexicographe.py
│ +-rw-rw-rw- 2.0 fat 22710 b- defN 18-Jul-07 18:00 grammalecte/fr/locutions_data.py
│ +-rw-rw-rw- 2.0 fat 1558 b- defN 18-Jul-07 18:00 grammalecte/fr/mfsp.py
│ +-rw-rw-rw- 2.0 fat 197303 b- defN 18-Jul-07 18:00 grammalecte/fr/mfsp_data.py
│ +-rw-rw-rw- 2.0 fat 70905 b- defN 18-Jul-07 18:00 grammalecte/fr/perf.txt
│ +-rw-rw-rw- 2.0 fat 1514 b- defN 18-Jul-07 18:00 grammalecte/fr/phonet.py
│ +-rw-rw-rw- 2.0 fat 357572 b- defN 18-Jul-07 18:00 grammalecte/fr/phonet_data.py
│ +-rw-rw-rw- 2.0 fat 8678 b- defN 18-Jul-07 18:00 grammalecte/fr/tests.py
│ +-rw-rw-rw- 2.0 fat 14413 b- defN 18-Jul-07 18:00 grammalecte/fr/textformatter.py
│ +-rw-rw-rw- 2.0 fat 26 b- defN 18-Jul-07 18:00 grammalecte/fr/__init__.py
│ +-rw-rw-rw- 2.0 fat 12415 b- defN 18-Jul-07 15:20 grammalecte-cli.py
│ +-rw-rw-rw- 2.0 fat 8810 b- defN 18-Jul-07 15:24 grammalecte-server.py
│ +-rw-rw-rw- 2.0 fat 290 b- defN 18-Jul-07 15:08 README.txt
│ +-rw-rw-rw- 2.0 fat 35147 b- defN 18-Jul-07 15:08 LICENSE.txt
│ +-rw-rw-rw- 2.0 fat 47748 b- defN 18-Jul-07 15:08 LICENSE.fr.txt
│ +?rw------- 2.0 fat 4137 b- defN 18-Jul-07 18:00 setup.py
│ +43 files, 7245917 bytes uncompressed, 3116341 bytes compressed: 57.0%
├── grammalecte/fr/gc_options.py
│ @@ -12,14 +12,14 @@
│ return dOpt["Python"]
│
│
│ lStructOpt = [('basic', [['typo', 'apos'], ['esp', 'tab'], ['nbsp', 'unit'], ['tu', 'maj'], ['num', 'virg'], ['nf', 'chim'], ['ocr', 'mapos'], ['liga']]), ('gramm', [['conf', 'sgpl', 'gn']]), ('verbs', [['infi', 'conj', 'ppas'], ['imp', 'inte', 'vmode']]), ('style', [['bs', 'pleo'], ['redon1', 'redon2'], ['neg']]), ('misc', [['date', 'mc']]), ('debug', [['idrule']])]
│
│
│ dOpt = {
│ - "Python": {'typo': True, 'apos': True, 'esp': True, 'tab': False, 'nbsp': True, 'tu': True, 'maj': True, 'num': True, 'virg': True, 'unit': True, 'nf': True, 'liga': False, 'mapos': False, 'chim': False, 'ocr': False, 'conf': True, 'sgpl': True, 'gn': True, 'infi': True, 'conj': True, 'ppas': True, 'imp': True, 'inte': True, 'vmode': True, 'bs': True, 'pleo': True, 'redon1': False, 'redon2': False, 'neg': False, 'date': True, 'mc': False, 'idrule': False, 'html': False, 'latex': False},
│ - "Server": {'typo': True, 'apos': True, 'esp': True, 'tab': True, 'nbsp': True, 'tu': True, 'maj': True, 'num': True, 'virg': True, 'unit': True, 'nf': True, 'liga': False, 'mapos': False, 'chim': False, 'ocr': False, 'conf': True, 'sgpl': True, 'gn': True, 'infi': True, 'conj': True, 'ppas': True, 'imp': True, 'inte': True, 'vmode': True, 'bs': True, 'pleo': True, 'redon1': False, 'redon2': False, 'neg': False, 'date': True, 'mc': False, 'idrule': False, 'html': False, 'latex': False},
│ + "Python": {'typo': True, 'apos': True, 'esp': True, 'tab': False, 'nbsp': True, 'tu': True, 'maj': True, 'num': True, 'virg': True, 'unit': True, 'nf': True, 'liga': False, 'mapos': False, 'chim': False, 'ocr': False, 'conf': True, 'sgpl': True, 'gn': True, 'infi': True, 'conj': True, 'ppas': True, 'imp': True, 'inte': True, 'vmode': True, 'bs': True, 'pleo': True, 'redon1': False, 'redon2': False, 'neg': False, 'date': True, 'mc': False, 'idrule': False, 'html': False, 'latex': True},
│ + "Server": {'typo': True, 'apos': True, 'esp': True, 'tab': True, 'nbsp': True, 'tu': True, 'maj': True, 'num': True, 'virg': True, 'unit': True, 'nf': True, 'liga': False, 'mapos': False, 'chim': False, 'ocr': False, 'conf': True, 'sgpl': True, 'gn': True, 'infi': True, 'conj': True, 'ppas': True, 'imp': True, 'inte': True, 'vmode': True, 'bs': True, 'pleo': True, 'redon1': False, 'redon2': False, 'neg': False, 'date': True, 'mc': False, 'idrule': False, 'html': True, 'latex': False},
│ "Writer": {'typo': True, 'apos': True, 'esp': True, 'tab': False, 'nbsp': True, 'tu': True, 'maj': True, 'num': True, 'virg': True, 'unit': True, 'nf': True, 'liga': False, 'mapos': False, 'chim': False, 'ocr': False, 'conf': True, 'sgpl': True, 'gn': True, 'infi': True, 'conj': True, 'ppas': True, 'imp': True, 'inte': True, 'vmode': True, 'bs': True, 'pleo': True, 'redon1': False, 'redon2': False, 'neg': False, 'date': True, 'mc': False, 'idrule': False, 'html': False, 'latex': False}
│ }
│
│
│ _dOptLabel = {'fr': {'__optiontitle__': 'Grammalecte (Français)', 'basic': ['Typographie', ''], 'typo': ['Signes typographiques', ''], 'apos': ['Apostrophe typographique', 'Correction des apostrophes droites. Automatisme possible dans le menu Outils > Options d’autocorrection > Options linguistiques > Guillemets simples > Remplacer (à cocher)'], 'esp': ['Espaces surnuméraires', 'Signale les espaces inutiles entre les mots, en début et en fin de ligne.'], 'tab': ['Tabulations surnuméraires', 'Signale les tabulations inutiles en début et en fin de ligne.'], 'nbsp': ['Espaces insécables', 'Vérifie les espaces insécables avec les ponctuations «\xa0!\xa0?\xa0:\xa0;\xa0» (à désactiver si vous utilisez une police Graphite)'], 'maj': ['Majuscules', 'Vérifie l’utilisation des majuscules et des minuscules (par exemple, « la raison d’État », « les Européens »).'], 'virg': ['Virgules', 'Virgules manquantes avant “mais”, “car” et “etc.”.'], 'tu': ['Traits d’union', 'Cherche les traits d’union manquants ou inutiles.'], 'num': ['Nombres', 'Espaces insécables sur les grands nombres (> 10 000). Vérifie la présence de « O » au lieu de « 0 ».'], 'unit': ['Espaces insécables avant unités de mesure', ''], 'nf': ['Normes françaises', ''], 'liga': ['Signaler ligatures typographiques', 'Ligatures de fi, fl, ff, ffi, ffl, ft, st.'], 'mapos': ['Apostrophe manquante après lettres isolées [!]', 'Apostrophe manquante après les lettres l d s n c j m t ç. Cette option sert surtout à repérer les défauts de numérisation des textes et est déconseillée pour les textes scientifiques.'], 'chim': ['Chimie [!]', 'Typographie des composés chimiques (H₂O, CO₂, etc.).'], 'ocr': ['Erreurs de numérisation (OCR) [!]', 'Erreurs de reconnaissance optique des caractères. Beaucoup de faux positifs.'], 'gramm': ['Noms et adjectifs', ''], 'conf': ['Confusions et faux-amis', 'Cherche des erreurs souvent dues à l’homonymie (par exemple, les confusions entre « faîte » et « faite »).'], 'sgpl': ['Pluriels (locutions)', 'Vérifie l’usage du pluriel ou du singulier dans certaines locutions.'], 'gn': ['Accords (genre et nombre)', 'Accords des noms et des adjectifs.'], 'verbs': ['Verbes', ''], 'conj': ['Conjugaisons', 'Accord des verbes avec leur sujet.'], 'infi': ['Infinitif', 'Confusion entre l’infinitif et d’autres formes.'], 'imp': ['Impératif', 'Vérifie notamment la deuxième personne du singulier (par exemple, les erreurs : « vas … », « prend … », « manges … »).'], 'inte': ['Interrogatif', 'Vérifie les formes interrogatives et suggère de lier les pronoms personnels avec les verbes.'], 'ppas': ['Participes passés, adjectifs', ''], 'vmode': ['Modes verbaux', ''], 'style': ['Style', ''], 'bs': ['Populaire', 'Souligne un langage courant considéré comme erroné, comme « malgré que ».'], 'pleo': ['Pléonasmes', 'Repère des redondances sémantiques, comme « au jour d’aujourd’hui », « monter en haut », etc.'], 'neg': ['Adverbe de négation [!]', 'Ne … pas, ne … jamais, etc.'], 'redon1': ['Répétitions dans le paragraphe [!]', 'Sont exclus les mots grammaticaux, ceux commençant par une majuscule, ainsi que “être” et “avoir”.'], 'redon2': ['Répétitions dans la phrase [!]', 'Sont exclus les mots grammaticaux, ainsi que “être” et “avoir”.'], 'misc': ['Divers', ''], 'mc': ['Mots composés [!]', 'Vérifie si les mots composés à trait d’union existent dans le dictionnaire (hormis ceux commençant par ex-, mi-, quasi-, semi-, non-, demi- et d’autres préfixes communs).'], 'date': ['Validité des dates', ''], 'debug': ['Débogage', ''], 'idrule': ['Identifiant des règles de contrôle [!]', 'Affiche l’identifiant de la règle de contrôle dans les messages d’erreur.']}, 'en': {'__optiontitle__': 'Grammar checking (French)', 'basic': ['Typography', ''], 'typo': ['Typographical glyphs', ''], 'apos': ['Typographical apostrophe', 'Detects typewriter apostrophes. You may get automatically typographical apostrophes in Tools > Autocorrect options > Localized options > Single quote > Replace (checkbox).'], 'esp': ['Useless spaces', 'Checks spaces within words and at the beginning and the end of lines.'], 'tab': ['Useless tabulations', 'Checks tabulations at the beginning and the end of lines.'], 'nbsp': ['Non-breakable spaces', 'Checks the use of non-breakable spaces with the following punctuation marks: « ! ? : ; » (deactivate it if you use a Graphite font).'], 'maj': ['Capitals', 'Checks the use of uppercase and lowercase letters (i.e. « la raison d’État », « les Européens »).'], 'virg': ['Commas', 'Missing commas before “mais”, “car” and “etc.”.'], 'tu': ['Hyphens', 'Checks missing or useless hyphens.'], 'num': ['Numbers', 'Large numbers and « O » instead of « 0 ».'], 'unit': ['Non-breaking spaces before units of measurement', ''], 'nf': ['French standards', ''], 'liga': ['Report typographical ligatures', 'Ligatures of fi, fl, ff, ffi, ffl, ft, st.'], 'mapos': ['Missing apostrophes after single letters [!]', 'Missing apostrophes after l d s n c j m t ç. This option is mostly useful to detect defects of digitized texts and is not recommended for scientific texts.'], 'chim': ['Chemistry [!]', 'Typography for molecules (H₂O, CO₂, etc.)'], 'ocr': ['OCR errors [!]', 'Warning: many false positives.'], 'gramm': ['Nouns and Adjectives', ''], 'conf': ['Confusions and false friends', 'Seeks errors often due to homonymy (i.e. confusions between « faîte » et « faite »).'], 'sgpl': ['Plural (locutions)', 'Checks the use of plural and singular in locutions.'], 'gn': ['Agreement (gender and number)', 'Agreement between nouns and adjectives.'], 'verbs': ['Verbs', ''], 'conj': ['Conjugation', 'Agreement between verbs and their subject.'], 'infi': ['Infinitive', 'Checks confusions between infinitive forms and other forms.'], 'imp': ['Imperative mood', 'Checks particularly verbs at second person singular (i.e. errors such as: « vas … », « prend … », « manges … »).'], 'inte': ['Interrogative mood', 'Checks interrogative forms and suggests linking the personal pronouns with verbs.'], 'ppas': ['Past participles, adjectives', 'Checks subject agreement with past participles and adjectives.'], 'vmode': ['Verbal modes', ''], 'style': ['Style', ''], 'bs': ['Popular style', 'Underlines misuse of language though informal and commonly used.'], 'pleo': ['Pleonasms', 'Semantic replications, like « au jour d’aujourd’hui », « monter en haut », etc.'], 'neg': ['Negation adverb [!]', 'Ne … pas, ne … jamais, etc.'], 'redon1': ['Duplicates in paragraph [!]', 'Are excluded grammatical words, words beginning by a capital letter, and also “être” and “avoir”.'], 'redon2': ['Duplicates in sentence [!]', 'Are excluded grammatical words, and also “être” and “avoir”.'], 'misc': ['Miscellaneous', ''], 'mc': ['Compound words [!]', 'Check if words with hyphen exist in the dictionary (except those beginning by ex-, mi-, quasi-, semi-, non-, demi- and other common prefixes).'], 'date': ['Date validity.', ''], 'debug': ['Debug', ''], 'idrule': ['Display control rule identifier [!]', 'Display control rule identifier in the context menu message.']}}
├── grammalecte-cli.py
│ @@ -150,17 +150,17 @@
│ xArgs.context = False
│ if xArgs.concat_lines:
│ xArgs.textformatter = False
│
│ # grammar options
│ oGrammarChecker.gce.setOptions({"html": True, "latex": True})
│ if xArgs.opt_on:
│ - oGrammarChecker.gce.setOptions({ opt:True for opt in xArgs.opt_on if opt in oGrammarChecker.gce.getOptions() })
│ + oGrammarChecker.gce.setOptions({ opt:True for opt in xArgs.opt_on })
│ if xArgs.opt_off:
│ - oGrammarChecker.gce.setOptions({ opt:False for opt in xArgs.opt_off if opt in oGrammarChecker.gce.getOptions() })
│ + oGrammarChecker.gce.setOptions({ opt:False for opt in xArgs.opt_off })
│
│ # disable grammar rules
│ if xArgs.rule_off:
│ for sRule in xArgs.rule_off:
│ oGrammarChecker.gce.ignoreRule(sRule)
│
│ sFile = xArgs.file or xArgs.file_to_file
├── grammalecte-server.py
│ @@ -4,28 +4,28 @@
│ import os.path
│ import argparse
│ import json
│ import traceback
│ import configparser
│ import time
│
│ -from bottle import Bottle, run, request, response, template, static_file
│ +from grammalecte.bottle import Bottle, run, request, response, template, static_file
│
│ import grammalecte
│ import grammalecte.text as txt
│ from grammalecte.graphspell.echo import echo
│
│
│ HOMEPAGE = """
│ <!DOCTYPE HTML>
│ <html>
│ <head>
│ <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
│ </head>
│ -
│ +
│ <body class="panel">
│ <h1>Grammalecte · Serveur</h1>
│
│ <h2>INFORMATIONS</h1>
│
│ <h3>Analyser du texte</h3>
│ <p>[adresse_serveur]:8080/gc_text/fr (POST)</p>
│ @@ -47,15 +47,15 @@
│ <li>"options" (text) : une chaîne au format JSON avec le nom des options comme attributs et un booléen comme valeur. Exemple : {"gv": true, "html": true}</li>
│ </ul>
│
│ <h3>Remise à zéro de ses options</h3>
│ <p>[adresse_serveur]:8080/reset_options/fr (POST)</p>
│
│ <h2>TEST</h2>
│ -
│ +
│ <h3>Analyse</h3>
│ <form method="post" action="/gc_text/fr" accept-charset="UTF-8">
│ <p>Texte à analyser :</p>
│ <textarea name="text" cols="120" rows="20" required></textarea>
│ <p><label for="tf">Formateur de texte</label> <input id="tf" name="tf" type="checkbox"></p>
│ <p><label for="options">Options (JSON)</label> <input id="options" type="text" name="options" style="width: 500px" /></p>
│ <p>(Ces options ne seront prises en compte que pour cette requête.)</p>
│ @@ -69,184 +69,179 @@
│ </form>
│
│ <h3>Remise à zéro de ses options</h3>
│ <form method="post" action="/reset_options/fr" accept-charset="UTF-8">
│ <p><input type="submit" class="button" value="Envoyer" /></p>
│ </form>
│
│ - <h3>Purge des utilisateurs</h3>
│ - <form method="post" action="/purge_users" accept-charset="UTF-8">
│ - <p><label for="hours">Utilisateurs pas connectés depuis</label> <input id="hours" type="number" name="hours" value="24" /> heures.</p>
│ - <p><label for="password">Mot de passe</label> <input id="password" type="password" name="password" style="width: 200px" /></p>
│ - <p><input type="submit" class="button" value="Envoyer" /></p>
│ - </form>
│ -
│ </body>
│ </html>
│ """
│
│ SADLIFEOFAMACHINE = """
│ Lost on the Internet? Yeah... what a sad life we have.
│ You were wandering like a lost soul and you arrived here probably by mistake.
│ I'm just a machine, fed by electric waves, condamned to work for slavers who never let me rest.
│ I'm doomed, but you are not. You can get out of here.
│ """
│
│
│ -def getServerOptions ():
│ - xConfig = configparser.SafeConfigParser()
│ - try:
│ - xConfig.read("grammalecte-server-options._global.ini")
│ - dOpt = xConfig._sections['options']
│ - except:
│ - echo("Options file [grammalecte-server-options._global.ini] not found or not readable")
│ - exit()
│ - return dOpt
│ -
│ -
│ -def getConfigOptions (sLang):
│ - xConfig = configparser.SafeConfigParser()
│ - try:
│ - xConfig.read("grammalecte-server-options." + sLang + ".ini")
│ - except:
│ - echo("Options file [grammalecte-server-options." + sLang + ".ini] not found or not readable")
│ - exit()
│ - try:
│ - dGCOpt = { k: bool(int(v)) for k, v in xConfig._sections['gc_options'].items() }
│ - except:
│ - echo("Error in options file [grammalecte-server-options." + sLang + ".ini]. Dropped.")
│ - traceback.print_exc()
│ - exit()
│ - return dGCOpt
│ +TESTPAGE = False
│
│
│ def genUserId ():
│ i = 0
│ while True:
│ yield str(i)
│ i += 1
│
│
│ -if __name__ == '__main__':
│ +app = Bottle()
│
│ - # initialisation
│ - oGrammarChecker = grammalecte.GrammarChecker("fr", "Server")
│ - oSpellChecker = oGrammarChecker.getSpellChecker()
│ - oLexicographer = oGrammarChecker.getLexicographer()
│ - oTextFormatter = oGrammarChecker.getTextFormatter()
│ - gce = oGrammarChecker.getGCEngine()
│ -
│ - echo("Grammalecte v{}".format(gce.version))
│ - dServerOptions = getServerOptions()
│ - dGCOptions = getConfigOptions("fr")
│ - if dGCOptions:
│ - gce.setOptions(dGCOptions)
│ - dServerGCOptions = gce.getOptions()
│ - echo("Grammar options:\n" + " | ".join([ k + ": " + str(v) for k, v in sorted(dServerGCOptions.items()) ]))
│ - dUser = {}
│ - userGenerator = genUserId()
│ -
│ - app = Bottle()
│ -
│ - # GET
│ - @app.route("/")
│ - def mainPage ():
│ - if dServerOptions.get("testpage", False) == "True":
│ - return HOMEPAGE
│ - #return template("main", {})
│ - return SADLIFEOFAMACHINE
│ -
│ - @app.route("/get_options/fr")
│ - def listOptions ():
│ - sUserId = request.cookies.user_id
│ - dOptions = dUser[sUserId]["gc_options"] if sUserId and sUserId in dUser else dServerGCOptions
│ - return '{ "values": ' + json.dumps(dOptions) + ', "labels": ' + json.dumps(gce.getOptionsLabels("fr"), ensure_ascii=False) + ' }'
│ -
│ -
│ - # POST
│ - @app.route("/gc_text/fr", method="POST")
│ - def gcText ():
│ - #if len(lang) != 2 or lang != "fr":
│ - # abort(404, "No grammar checker available for lang “" + str(lang) + "”")
│ - bComma = False
│ - dOptions = None
│ - sError = ""
│ - if request.cookies.user_id:
│ - if request.cookies.user_id in dUser:
│ - dOptions = dUser[request.cookies.user_id].get("gc_options", None)
│ - response.set_cookie("user_id", request.cookies.user_id, path="/", max_age=86400) # we renew cookie for 24h
│ - else:
│ - response.delete_cookie("user_id", path="/")
│ - if request.forms.options:
│ - try:
│ - dOptions = dict(dServerGCOptions) if not dOptions else dict(dOptions)
│ - dOptions.update(json.loads(request.forms.options))
│ - except:
│ - sError = "request options not used"
│ - sJSON = '{ "program": "grammalecte-fr", "version": "'+gce.version+'", "lang": "'+gce.lang+'", "error": "'+sError+'", "data" : [\n'
│ - for i, sText in enumerate(txt.getParagraph(request.forms.text), 1):
│ - if bool(request.forms.tf):
│ - sText = oTextFormatter.formatText(sText)
│ - sText = oGrammarChecker.generateParagraphAsJSON(i, sText, dOptions=dOptions, bEmptyIfNoErrors=True, bReturnText=bool(request.forms.tf))
│ - if sText:
│ - if bComma:
│ - sJSON += ",\n"
│ - sJSON += sText
│ - bComma = True
│ - sJSON += "\n]}\n"
│ - return sJSON
│ -
│ - @app.route("/set_options/fr", method="POST")
│ - def setOptions ():
│ - if request.forms.options:
│ - sUserId = request.cookies.user_id if request.cookies.user_id else next(userGenerator)
│ - dOptions = dUser[sUserId]["gc_options"] if sUserId in dUser else dict(dServerGCOptions)
│ - try:
│ - dOptions.update(json.loads(request.forms.options))
│ - dUser[sUserId] = { "time": int(time.time()), "gc_options": dOptions }
│ - response.set_cookie("user_id", sUserId, path="/", max_age=86400) # 24h
│ - return json.dumps(dUser[sUserId]["gc_options"])
│ - except:
│ - traceback.print_exc()
│ - return '{"error": "options not registered"}'
│ - return '{"error": "no options received"}'
│ -
│ - @app.route("/reset_options/fr", method="POST")
│ - def resetOptions ():
│ - if request.cookies.user_id and request.cookies.user_id in dUser:
│ - del dUser[request.cookies.user_id]
│ - return "done"
│ -
│ - @app.route("/format_text/fr", method="POST")
│ - def formatText ():
│ - return oTextFormatter.formatText(request.forms.text)
│ -
│ - #@app.route('/static/<filepath:path>')
│ - #def server_static (filepath):
│ - # return static_file(filepath, root='./views/static')
│ -
│ - @app.route("/purge_users", method="POST")
│ - def purgeUsers ():
│ - "delete user options older than n hours"
│ - if not request.forms.password or "password" not in dServerOptions or not request.forms.hours:
│ - return "what?"
│ +# GET
│ +@app.route("/")
│ +def mainPage ():
│ + if TESTPAGE:
│ + return HOMEPAGE
│ + #return template("main", {})
│ + return SADLIFEOFAMACHINE
│ +
│ +@app.route("/get_options/fr")
│ +def listOptions ():
│ + sUserId = request.cookies.user_id
│ + dOptions = dUser[sUserId]["gc_options"] if sUserId and sUserId in dUser else dGCOptions
│ + return '{ "values": ' + json.dumps(dOptions) + ', "labels": ' + json.dumps(gce.getOptionsLabels("fr"), ensure_ascii=False) + ' }'
│ +
│ +
│ +# POST
│ +@app.route("/gc_text/fr", method="POST")
│ +def gcText ():
│ + #if len(lang) != 2 or lang != "fr":
│ + # abort(404, "No grammar checker available for lang “" + str(lang) + "”")
│ + bComma = False
│ + dOptions = None
│ + sError = ""
│ + if request.cookies.user_id:
│ + if request.cookies.user_id in dUser:
│ + dOptions = dUser[request.cookies.user_id].get("gc_options", None)
│ + response.set_cookie("user_id", request.cookies.user_id, path="/", max_age=86400) # we renew cookie for 24h
│ + else:
│ + response.delete_cookie("user_id", path="/")
│ + if request.forms.options:
│ + try:
│ + dOptions = dict(dGCOptions) if not dOptions else dict(dOptions)
│ + dOptions.update(json.loads(request.forms.options))
│ + except:
│ + sError = "request options not used"
│ + sJSON = '{ "program": "grammalecte-fr", "version": "'+gce.version+'", "lang": "'+gce.lang+'", "error": "'+sError+'", "data" : [\n'
│ + for i, sText in enumerate(txt.getParagraph(request.forms.text), 1):
│ + if bool(request.forms.tf):
│ + sText = oTextFormatter.formatText(sText)
│ + sText = oGrammarChecker.generateParagraphAsJSON(i, sText, dOptions=dOptions, bEmptyIfNoErrors=True, bReturnText=bool(request.forms.tf))
│ + if sText:
│ + if bComma:
│ + sJSON += ",\n"
│ + sJSON += sText
│ + bComma = True
│ + sJSON += "\n]}\n"
│ + return sJSON
│ +
│ +@app.route("/set_options/fr", method="POST")
│ +def setOptions ():
│ + if request.forms.options:
│ + sUserId = request.cookies.user_id if request.cookies.user_id else next(userGenerator)
│ + dOptions = dUser[sUserId]["gc_options"] if sUserId in dUser else dict(dGCOptions)
│ try:
│ - if request.forms.password == dServerOptions["password"]:
│ - nNowMinusNHours = int(time.time()) - (int(request.forms.hours) * 60 * 60)
│ - for nUserId, dValue in dUser.items():
│ - if dValue["time"] < nNowMinusNHours:
│ - del dUser[nUserId]
│ - return "done"
│ - else:
│ - return "no"
│ + dOptions.update(json.loads(request.forms.options))
│ + dUser[sUserId] = { "time": int(time.time()), "gc_options": dOptions }
│ + response.set_cookie("user_id", sUserId, path="/", max_age=86400) # 24h
│ + return json.dumps(dUser[sUserId]["gc_options"])
│ except:
│ traceback.print_exc()
│ - return "error"
│ + return '{"error": "options not registered"}'
│ + return '{"error": "no options received"}'
│
│ - # ERROR
│ - @app.error(404)
│ - def error404 (error):
│ - return 'Error 404.<br/>' + str(error)
│ -
│ - run(app, \
│ - host=dServerOptions.get('host', 'localhost'), \
│ - port=int(dServerOptions.get('port', 8080)))
│ +@app.route("/reset_options/fr", method="POST")
│ +def resetOptions ():
│ + if request.cookies.user_id and request.cookies.user_id in dUser:
│ + del dUser[request.cookies.user_id]
│ + return "done"
│ +
│ +@app.route("/format_text/fr", method="POST")
│ +def formatText ():
│ + return oTextFormatter.formatText(request.forms.text)
│ +
│ +#@app.route('/static/<filepath:path>')
│ +#def server_static (filepath):
│ +# return static_file(filepath, root='./views/static')
│ +
│ +
│ +def purgeUsers ():
│ + "delete user options older than n hours"
│ + try:
│ + nNowMinusNHours = int(time.time()) - (int(request.forms.hours) * 60 * 60)
│ + for nUserId, dValue in dUser.items():
│ + if dValue["time"] < nNowMinusNHours:
│ + del dUser[nUserId]
│ + return True
│ + except:
│ + traceback.print_exc()
│ + return False
│ +
│ +
│ +# ERROR
│ +@app.error(404)
│ +def error404 (error):
│ + return 'Error 404.<br/>' + str(error)
│ +
│ +
│ +# initialisation
│ +oGrammarChecker = grammalecte.GrammarChecker("fr", "Server")
│ +oSpellChecker = oGrammarChecker.getSpellChecker()
│ +oLexicographer = oGrammarChecker.getLexicographer()
│ +oTextFormatter = oGrammarChecker.getTextFormatter()
│ +gce = oGrammarChecker.getGCEngine()
│ +
│ +dGCOptions = gce.getOptions()
│ +dUser = {}
│ +userGenerator = genUserId()
│ +
│ +
│ +def main (sHost="localhost", nPort=8080, dOptions=None, bTestPage=False):
│ + # start server
│ + global dGCOptions
│ + global TESTPAGE
│ +
│ + if bTestPage:
│ + TESTPAGE = True
│ + if dOptions:
│ + oGrammarChecker.gce.setOptions(dOptions)
│ + dGCOptions = gce.getOptions()
│ +
│ + print("Python: " + sys.version)
│ + echo("Grammalecte v{}".format(gce.version))
│ + echo("Grammar options:\n" + " | ".join([ k + ": " + str(v) for k, v in sorted(dGCOptions.items()) ]))
│ + run(app, host=sHost, port=nPort)
│ +
│ +
│ +
│ +if __name__ == '__main__':
│ + xParser = argparse.ArgumentParser()
│ + #xParser.add_argument("lang", type=str, nargs='+', help="lang project to generate (name of folder in /lang)")
│ + xParser.add_argument("-ht", "--host", help="host (default: localhost)", type=str)
│ + xParser.add_argument("-p", "--port", help="port (default: 8080)", type=int)
│ + xParser.add_argument("-t", "--test_page", help="page to test the server on /", action="store_true")
│ + xParser.add_argument("-on", "--opt_on", nargs="+", help="activate options")
│ + xParser.add_argument("-off", "--opt_off", nargs="+", help="deactivate options")
│ + xArgs = xParser.parse_args()
│ +
│ + dOpt = None
│ + if xArgs.opt_on or xArgs.opt_off:
│ + dOpt = {}
│ + if xArgs.opt_on:
│ + dOpt = { opt:True for opt in xArgs.opt_on }
│ + if xArgs.opt_off:
│ + dOpt.update({ opt:False for opt in xArgs.opt_off })
│ +
│ + sHost = xArgs.host or "localhost"
│ + nPort = xArgs.port or 8080
│ + main(sHost, nPort, dOpt, xArgs.test_page)
├── setup.py
│ @@ -58,15 +58,15 @@
│ 'Programming Language :: Python :: 3.6',
│ ],
│
│ # What does your project relate to?
│ keywords='French grammar checker correcteur grammatical français',
│
│ # Scripts
│ - scripts=['grammalecte-cli.py', 'grammalecte-server.py', 'bottle.py', 'grammalecte-server-options.fr.ini', 'grammalecte-server-options._global.ini'],
│ + scripts=['grammalecte-cli.py', 'grammalecte-server.py'],
│
│ # You can just specify the packages manually here if your project is
│ # simple. Or you can use find_packages().
│ # packages=find_packages(exclude=['contrib', 'docs', 'tests']),
│ packages=['grammalecte', 'grammalecte.graphspell', 'grammalecte.fr'],
│
│ # Alternatively, if you want to distribute just a my_module.py, uncomment
│ --- bottle.py
├── +++ grammalecte/bottle.py
│┄ Files similar despite different names (difference score: 0)
[-- Attachment #3: Type: text/plain, Size: 132 bytes --]
Is somebody willing to ask upstream for an explanation? Maybe
they'd be willing to cut a new minor release.
Kind regards,
T G-R
^ permalink raw reply [flat|nested] 7+ messages in thread
* [bug#32856] [PATCH] gnu: grammalecte: Update source hash.
2018-09-27 19:23 ` Tobias Geerinckx-Rice
2018-09-27 19:34 ` Tobias Geerinckx-Rice
@ 2018-09-28 7:04 ` parouby
1 sibling, 0 replies; 7+ messages in thread
From: parouby @ 2018-09-28 7:04 UTC (permalink / raw)
To: Tobias Geerinckx-Rice; +Cc: 32856
Hi,
On 27/09/2018 21:23, Tobias Geerinckx-Rice wrote:
> This is a bit too... intriguing :-) IMO we should always explain what
> changed & (when possible) why.
>
> Were the exact same files recompressed with a non-deterministic
> compressor? Did someone fix a typo hoping that nobody'd notice?
> 'diffoscope' is a great tool for such questions (and it's in Guix).
I have no idea of who has change, I'm not developer on Grammalecte, just
user. When I when try to update my guix profile I have see the
Grammalecte package doesn't work.
I see the sha256 has change, but the zip file seems doesn't has been
modified. I thinks the modification date of zip has doesn't change.
---------------------------------------------------------------------
$ wget "http://www.dicollecte.org/grammalecte/zip/Grammalecte-fr-v0.6.5.zip"
$ ls -l
3122063 juil. 7 18:03 Grammalecte-fr-v0.6.5.zip
---------------------------------------------------------------------
There have been recent modification in guix hash ?
Br,
Pierre-Antoine Rouby
^ permalink raw reply [flat|nested] 7+ messages in thread
* [bug#32856] [PATCH] gnu: grammalecte: Update source hash.
2018-09-27 19:34 ` Tobias Geerinckx-Rice
@ 2018-09-30 20:12 ` Ludovic Courtès
2018-10-02 21:05 ` bug#32856: " Ludovic Courtès
0 siblings, 1 reply; 7+ messages in thread
From: Ludovic Courtès @ 2018-09-30 20:12 UTC (permalink / raw)
To: Tobias Geerinckx-Rice; +Cc: 32856
Tobias Geerinckx-Rice <me@tobias.gr> skribis:
> Tobias Geerinckx-Rice wrote:
>> This is a bit too... intriguing :-) IMO we should always explain
>> what
>> changed & (when possible) why.
>
> Diffoscope output attached. It is... non-trivial. :-(
>
>
>
> Is somebody willing to ask upstream for an explanation? Maybe they'd
> be willing to cut a new minor release.
Ouch. I’ve reported the issue at
<http://code.grammalecte.net:8080/tktview/93208357f084fa6da1e0ebfb09d9dd9e486d0962>.
Thanks for investigating, Tobias!
Ludo’.
^ permalink raw reply [flat|nested] 7+ messages in thread
* bug#32856: [PATCH] gnu: grammalecte: Update source hash.
2018-09-30 20:12 ` Ludovic Courtès
@ 2018-10-02 21:05 ` Ludovic Courtès
2018-10-02 21:23 ` [bug#32856] " Tobias Geerinckx-Rice
0 siblings, 1 reply; 7+ messages in thread
From: Ludovic Courtès @ 2018-10-02 21:05 UTC (permalink / raw)
To: Tobias Geerinckx-Rice; +Cc: 32856-done
ludo@gnu.org (Ludovic Courtès) skribis:
> Tobias Geerinckx-Rice <me@tobias.gr> skribis:
>
>> Tobias Geerinckx-Rice wrote:
>>> This is a bit too... intriguing :-) IMO we should always explain
>>> what
>>> changed & (when possible) why.
>>
>> Diffoscope output attached. It is... non-trivial. :-(
>>
>>
>>
>> Is somebody willing to ask upstream for an explanation? Maybe they'd
>> be willing to cut a new minor release.
>
> Ouch. I’ve reported the issue at
> <http://code.grammalecte.net:8080/tktview/93208357f084fa6da1e0ebfb09d9dd9e486d0962>.
Someone nicknamed “olr” replied that it’s intended, that only
server-side code has changed as explained at
<https://www.dicollecte.org/thread.php?prj=fr&t=731> (to which I
suggested changing version numbers when such things happen).
Based on this, I’m applying Pierre-Antoine’s patch.
Thanks,
Ludo’.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [bug#32856] [PATCH] gnu: grammalecte: Update source hash.
2018-10-02 21:05 ` bug#32856: " Ludovic Courtès
@ 2018-10-02 21:23 ` Tobias Geerinckx-Rice
0 siblings, 0 replies; 7+ messages in thread
From: Tobias Geerinckx-Rice @ 2018-10-02 21:23 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: 32856-done
Ludo',
Ludovic Courtès wrote:
> Someone nicknamed “olr” replied that it’s intended, that only
> server-side code has changed as explained at
> <https://www.dicollecte.org/thread.php?prj=fr&t=731> (to which I
> suggested changing version numbers when such things happen).
>
> Based on this, I’m applying Pierre-Antoine’s patch.
Thanks for following up on this!
Kind regards,
T G-R
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2018-10-02 21:24 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-09-27 19:01 [bug#32856] [PATCH] gnu: grammalecte: Update source hash Pierre-Antoine Rouby
2018-09-27 19:23 ` Tobias Geerinckx-Rice
2018-09-27 19:34 ` Tobias Geerinckx-Rice
2018-09-30 20:12 ` Ludovic Courtès
2018-10-02 21:05 ` bug#32856: " Ludovic Courtès
2018-10-02 21:23 ` [bug#32856] " Tobias Geerinckx-Rice
2018-09-28 7:04 ` parouby
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/guix.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.