unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
* [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)&nbsp;: une chaîne au format JSON avec le nom des options comme attributs et un booléen comme valeur. Exemple&nbsp;: {"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 public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).