[Git][debian-gis-team/glymur][master] 5 commits: New upstream version 0.13.7
Antonio Valentino (@antonio.valentino)
gitlab at salsa.debian.org
Sat Jan 18 10:47:21 GMT 2025
Antonio Valentino pushed to branch master at Debian GIS Project / glymur
Commits:
c350cea8 by Antonio Valentino at 2025-01-18T10:05:37+00:00
New upstream version 0.13.7
- - - - -
07208029 by Antonio Valentino at 2025-01-18T10:05:47+00:00
Update upstream source from tag 'upstream/0.13.7'
Update to upstream version '0.13.7'
with Debian dir 7d72c56563053efaa66a46b30917b3b5cb7b7f7f
- - - - -
1eeb2d09 by Antonio Valentino at 2025-01-18T10:06:25+00:00
New upstream release
- - - - -
6f93269b by Antonio Valentino at 2025-01-18T10:33:22+00:00
Drop d/source/lintian-overrides
- - - - -
fc8c9bd3 by Antonio Valentino at 2025-01-18T10:33:22+00:00
Set distribution to unstable
- - - - -
24 changed files:
- + .circleci/config.yml
- CHANGES.txt
- appveyor.yml
- ci/travis-310.yaml
- ci/travis-311-no-gdal.yaml
- ci/travis-311-no-opj.yaml
- ci/travis-311.yaml
- ci/travis-312.yaml
- + ci/travis-313.yaml
- ci/travis-39.yaml
- debian/changelog
- − debian/source/lintian-overrides
- docs/requirements.txt
- docs/source/conf.py
- docs/source/introduction.rst
- docs/source/whatsnew/0.13.rst
- glymur/jp2box.py
- glymur/jp2kr.py
- glymur/version.py
- setup.cfg
- + tests/data/countries.xml
- tests/test_jp2box_xml.py
- tests/test_printing.py
- tests/test_tiff2jp2.py
Changes:
=====================================
.circleci/config.yml
=====================================
@@ -0,0 +1,68 @@
+# See https://stackoverflow.com/questions/58243255/circleci-testing-with-specific-miniconda-python-and-numpy-versions
+#
+version: 2.0
+
+workflows:
+ version: 2
+ test:
+ jobs:
+ - travis-39
+ - travis-310
+ - travis-311-no-gdal
+ - travis-311-no-opj
+ - travis-311
+ - travis-312
+ - travis-313
+
+test-template: &test-template
+ docker:
+ - image: cimg/base:2021.04
+ steps:
+ - checkout
+
+ - run:
+ name: install anaconda
+ command: |
+ cd $HOME
+ wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh
+ chmod +x ~/miniconda.sh && bash ~/miniconda.sh -b -p $HOME/miniconda
+ export PATH=$HOME/miniconda/bin:$PATH
+
+ - run:
+ name: Install environment
+ command: |
+ export PATH="$HOME/miniconda/bin:$PATH"
+ conda update --yes conda
+ echo $PYTHON_VERSION
+ conda env create -f ci/$CIRCLE_JOB.yaml
+ source activate glymur
+ python --version
+
+ - run:
+ name: Run tests
+ command: |
+ export PATH=$HOME/miniconda/bin:$PATH
+ source activate glymur
+ pytest -n 4 -x
+
+jobs:
+ travis-39:
+ <<: *test-template
+
+ travis-310:
+ <<: *test-template
+
+ travis-311-no-gdal:
+ <<: *test-template
+
+ travis-311-no-opj:
+ <<: *test-template
+
+ travis-311:
+ <<: *test-template
+
+ travis-312:
+ <<: *test-template
+
+ travis-313:
+ <<: *test-template
=====================================
CHANGES.txt
=====================================
@@ -1,3 +1,11 @@
+Jan 15, 2025 - v0.13.7
+ Qualify on python 3.13
+ Fix test warnings due to scikit-image deprecation.
+ Update CI test matrix, tighten 3rd party library requirements.
+ Add ability to construct XML box from file-like object.
+ Add circle-ci CI.
+ Fix test suite for numpy 2.x printing (thanks to Arne Keller).
+
Aug 19, 2024 - v0.13.6
Fix tiff2jp2 when tile coverage not square.
=====================================
appveyor.yml
=====================================
@@ -27,25 +27,19 @@ environment:
- CONDA_ROOT: "C:\\Miniconda3_64"
PYTHON_VERSION: "3.11"
PYTHON_ARCH: "64"
- CONDA_PY: "311-no-opj"
- USE_PATH_FOR_GDAL_PYTHON: "YES"
-
- - CONDA_ROOT: "C:\\Miniconda3_64"
- PYTHON_VERSION: "3.11"
- PYTHON_ARCH: "64"
- CONDA_PY: "311-no-gdal"
+ CONDA_PY: "311"
USE_PATH_FOR_GDAL_PYTHON: "YES"
- CONDA_ROOT: "C:\\Miniconda3_64"
- PYTHON_VERSION: "3.11"
+ PYTHON_VERSION: "3.12"
PYTHON_ARCH: "64"
- CONDA_PY: "311"
+ CONDA_PY: "312"
USE_PATH_FOR_GDAL_PYTHON: "YES"
- CONDA_ROOT: "C:\\Miniconda3_64"
- PYTHON_VERSION: "3.12"
+ PYTHON_VERSION: "3.13"
PYTHON_ARCH: "64"
- CONDA_PY: "312"
+ CONDA_PY: "313"
USE_PATH_FOR_GDAL_PYTHON: "YES"
# We always use a 64-bit machine, but can build x86 distributions
=====================================
ci/travis-310.yaml
=====================================
@@ -3,9 +3,9 @@ channels:
- conda-forge
dependencies:
- python=3.10.*
- - gdal
- - libtiff
- - lxml
+ - gdal>=3.5.0,<3.6.0
+ - libtiff>=4.4.0,<4.5.0
+ - lxml>=4.9.0,<5.0.0
- numpy>=1.25,<1.26
- openjpeg>=2.4,<2.5
- pytest-xdist
=====================================
ci/travis-311-no-gdal.yaml
=====================================
@@ -3,8 +3,9 @@ channels:
- conda-forge
dependencies:
- python=3.11.*
- - libtiff
- - lxml
+ - gdal>=3.7.0,<3.8.0
+ - libtiff>=4.5.0,<4.6.0
+ - lxml>=5.0
- numpy>=1.26,<2.0
- openjpeg>=2.5
- pytest-xdist
=====================================
ci/travis-311-no-opj.yaml
=====================================
@@ -3,10 +3,10 @@ channels:
- conda-forge
dependencies:
- python=3.11.*
- - gdal
- - lxml
+ - gdal>=3.7.0,<3.8.0
+ - libtiff>=4.5.0,<4.6.0
+ - lxml>=5.0
- numpy>=1.26,<2.0
- pip
- pytest-xdist
- scikit-image
- - libtiff
=====================================
ci/travis-311.yaml
=====================================
@@ -3,9 +3,9 @@ channels:
- conda-forge
dependencies:
- python=3.11.*
- - gdal
- - libtiff
- - lxml
+ - gdal>=3.7.0,<3.8.0
+ - libtiff>=4.5.0,<4.6.0
+ - lxml>=5.0
- numpy>=1.26,<2.0
- openjpeg>=2.5
- pytest-xdist
=====================================
ci/travis-312.yaml
=====================================
@@ -3,9 +3,9 @@ channels:
- conda-forge
dependencies:
- python=3.12.*
- - gdal
- - libtiff
- - lxml
+ - gdal>=3.8.0,<3.9.0
+ - libtiff>=4.7.0,<4.8.0
+ - lxml>=5.0.0
- numpy>=2.0
- openjpeg>=2.5
- pytest-xdist
=====================================
ci/travis-313.yaml
=====================================
@@ -0,0 +1,12 @@
+name: glymur
+channels:
+ - conda-forge
+dependencies:
+ - python=3.13.*
+ - gdal>=3.10.0,<3.11.0
+ - libtiff>=4.7.0,<4.8.0
+ - lxml>=5.3.0
+ - numpy>=2.1
+ - openjpeg>=2.5
+ - pytest-xdist
+ - scikit-image
=====================================
ci/travis-39.yaml
=====================================
@@ -3,10 +3,10 @@ channels:
- conda-forge
dependencies:
- python=3.9.*
- - gdal
- - lxml
+ - gdal>=3.5.0,<3.6.0
+ - libtiff>=4.4.0,<4.5.0
+ - lxml>=4.9.0,<5.0.0
- numpy>=1.24,<1.25
- openjpeg>=2.4,<2.5
- scikit-image
- - libtiff
- pytest-xdist
=====================================
debian/changelog
=====================================
@@ -1,3 +1,10 @@
+glymur (0.13.7-1) unstable; urgency=medium
+
+ * New upstream release.
+ * Drop d/source/lintian-overrides, no longer needed.
+
+ -- Antonio Valentino <antonio.valentino at tiscali.it> Sat, 18 Jan 2025 10:10:29 +0000
+
glymur (0.13.6-1) unstable; urgency=medium
* New upstream release.
=====================================
debian/source/lintian-overrides deleted
=====================================
@@ -1,3 +0,0 @@
-# False positive: detected violations actually refer to the uuid library (not to uu)
-# which is not deprecated
-uses-deprecated-python-stdlib uu (deprecated in Python 3.11, removed in Python 3.13) [*]
=====================================
docs/requirements.txt
=====================================
@@ -1,3 +1,4 @@
numpydoc>=0.8
+sphinx<=7.4.7
sphinx_rtd_theme>=0.4.2
lxml
=====================================
docs/source/conf.py
=====================================
@@ -12,7 +12,8 @@
# All configuration values have a default; values that are commented out
# serve to show the default.
-import os, sys
+import os
+import sys
class Mock(object):
@@ -80,7 +81,7 @@ copyright = '2013-2024, John Evans'
# The short X.Y version.
version = '0.13'
# The full version, including alpha/beta/rc tags.
-release = '0.13.6'
+release = '0.13.7'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
=====================================
docs/source/introduction.rst
=====================================
@@ -13,7 +13,7 @@ Certain optional JP2 boxes can also be written, including XML boxes and
XMP UUIDs. There is incomplete support for reading JPX metadata.
The current version of glymur is supported on Python versions 3.10,
-3.11, and 3.12. You should have at least version 2.4.0 of OpenJPEG.
+3.11, 3.12, and 3.13. You should have at least version 2.4.0 of OpenJPEG.
For more information about OpenJPEG, please consult http://www.openjpeg.org.
=====================================
docs/source/whatsnew/0.13.rst
=====================================
@@ -2,6 +2,17 @@
Changes in glymur 0.13
######################
+*****************
+Changes in 0.13.7
+*****************
+
+ * Qualify on python 3.13
+ * Fix test warnings due to scikit-image deprecation.
+ * Update CI test matrix, tighten 3rd party library requirements.
+ * Add ability to construct XML box from file-like object.
+ * Add circle-ci CI.
+ * Fix test suite for numpy 2.x printing (thanks to Arne Keller).
+
*****************
Changes in 0.13.6
*****************
=====================================
glymur/jp2box.py
=====================================
@@ -2969,9 +2969,9 @@ class XMLBox(Jp2kBox):
----------
xml : ElementTree
An ElementTree object already existing in python.
- filename : str or path
- File from which to read XML. If filename is not None, then the xml
- keyword argument must be None.
+ filename : file, str, or pathlib.Path
+ File to read. If filename is not None, then the xml keyword
+ argument must be None.
"""
super().__init__()
if filename is not None and xml is not None:
@@ -2981,7 +2981,7 @@ class XMLBox(Jp2kBox):
)
raise RuntimeError(msg)
if filename is not None:
- self.xml = ET.parse(str(filename))
+ self.xml = ET.parse(filename)
else:
self.xml = xml
self.length = length
=====================================
glymur/jp2kr.py
=====================================
@@ -886,9 +886,9 @@ class Jp2kr(Jp2kBox):
def get_codestream(self, header_only=True):
"""Retrieve codestream.
- This differs from the codestream property in that segment
- metadata that lies past the end of the codestream header
- can be retrieved.
+ This differs from the codestream property in that segment
+ metadata that lies past the end of the codestream header
+ can be retrieved.
Parameters
----------
=====================================
glymur/version.py
=====================================
@@ -20,7 +20,7 @@ from .lib import tiff
# Do not change the format of this next line! Doing so risks breaking
# setup.py
-version = "0.13.6"
+version = "0.13.7"
version_tuple = parse(version).release
=====================================
setup.cfg
=====================================
@@ -1,6 +1,6 @@
[metadata]
name = Glymur
-version = 0.13.6
+version = 0.13.7
author = 'John Evans'
author_email = "John Evans" <jevans667cc at proton.me>
license = 'MIT'
@@ -15,6 +15,7 @@ classifiers =
Programming Language :: Python :: 3.10
Programming Language :: Python :: 3.11
Programming Language :: Python :: 3.12
+ Programming Language :: Python :: 3.13
Programming Language :: Python :: Implementation :: CPython
License :: OSI Approved :: MIT License
Intended Audience :: Science/Research
@@ -27,7 +28,7 @@ install_requires =
numpy
lxml
packaging
-python_requires = >=3.8
+python_requires = >=3.9
include_package_data = True
zip_safe = False
=====================================
tests/data/countries.xml
=====================================
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<data>
+ <country name="Liechtenstein">
+ <rank>1</rank>
+ <year>2008</year>
+ <gdppc>141100</gdppc>
+ <neighbor name="Austria" direction="E"/>
+ <neighbor name="Switzerland" direction="W"/>
+ </country>
+ <country name="Singapore">
+ <rank>4</rank>
+ <year>2011</year>
+ <gdppc>59900</gdppc>
+ <neighbor name="Malaysia" direction="N"/>
+ </country>
+ <country name="Panama">
+ <rank>68</rank>
+ <year>2011</year>
+ <gdppc>13600</gdppc>
+ <neighbor name="Costa Rica" direction="W"/>
+ <neighbor name="Colombia" direction="E"/>
+ </country>
+</data>
=====================================
tests/test_jp2box_xml.py
=====================================
@@ -4,8 +4,9 @@ Test suite specifically targeting the JP2 XML box layout.
"""
# Standard library imports
import importlib.resources as ir
-from io import BytesIO
+from io import BytesIO, StringIO
import pathlib
+import shutil
import struct
import warnings
@@ -30,35 +31,11 @@ class TestXML(fixtures.TestCommon):
def setUp(self):
super().setUp()
- raw_xml = b"""<?xml version="1.0"?>
- <data>
- <country name="Liechtenstein">
- <rank>1</rank>
- <year>2008</year>
- <gdppc>141100</gdppc>
- <neighbor name="Austria" direction="E"/>
- <neighbor name="Switzerland" direction="W"/>
- </country>
- <country name="Singapore">
- <rank>4</rank>
- <year>2011</year>
- <gdppc>59900</gdppc>
- <neighbor name="Malaysia" direction="N"/>
- </country>
- <country name="Panama">
- <rank>68</rank>
- <year>2011</year>
- <gdppc>13600</gdppc>
- <neighbor name="Costa Rica" direction="W"/>
- <neighbor name="Colombia" direction="E"/>
- </country>
- </data>"""
- path = self.test_dir_path / 'data.xml'
- with path.open(mode='wb') as tfile:
- tfile.write(raw_xml)
- tfile.flush()
- self.xmlfile_path = path
- self.xmlfile = str(path)
+ p = ir.files('tests.data').joinpath('countries.xml')
+ dest_path = self.test_dir_path / 'data.xml'
+ shutil.copyfile(p, dest_path)
+ self.xmlfile_path = dest_path
+ self.xmlfile = str(dest_path)
j2k = Jp2k(self.j2kfile)
codestream = j2k.get_codestream()
@@ -134,6 +111,40 @@ class TestXML(fixtures.TestCommon):
self.assertEqual(neighbor.attrib['name'], 'Malaysia')
self.assertEqual(neighbor.attrib['direction'], 'N')
+ def test_xml_from_bytesio_object(self):
+ """
+ SCENARIO: Create an xml box by pointing at a file-like BytesIO object
+
+ EXPECTED RESULT: The xml box is validated.
+ """
+ btext = self.xmlfile_path.read_bytes()
+ b = BytesIO(btext)
+ box = glymur.jp2box.XMLBox(filename=b)
+
+ elts = box.xml.findall('country')
+ self.assertEqual(len(elts), 3)
+
+ neighbor = elts[1].find('neighbor')
+ self.assertEqual(neighbor.attrib['name'], 'Malaysia')
+ self.assertEqual(neighbor.attrib['direction'], 'N')
+
+ def test_xml_from_stringio_object(self):
+ """
+ SCENARIO: Create an xml box by pointing at a file-like StringIO object
+
+ EXPECTED RESULT: The xml box is validated.
+ """
+ text = self.xmlfile_path.read_text()
+ sio = StringIO(text)
+ box = glymur.jp2box.XMLBox(filename=sio)
+
+ elts = box.xml.findall('country')
+ self.assertEqual(len(elts), 3)
+
+ neighbor = elts[1].find('neighbor')
+ self.assertEqual(neighbor.attrib['name'], 'Malaysia')
+ self.assertEqual(neighbor.attrib['direction'], 'N')
+
def test_utf8_xml_from_xml_file(self):
"""
XMLBox from an XML file with encoding declaration.
=====================================
tests/test_printing.py
=====================================
@@ -1074,7 +1074,8 @@ class TestPrinting(fixtures.TestCommon):
"array([ 0, 10, 20, ..., 70, 80, 90], dtype=uint32)),\n"
" ('ExifTag', OrderedDict([('Make', 'HTC')]))])" # noqa : E501
)
- self.assertEqual(actual, expected)
+ # Numpy 2.x adds shape to string representation
+ self.assertEqual(actual.replace("shape=(10,), ", ""), expected)
def test_crg(self):
"""verify printing of CRG segment"""
=====================================
tests/test_tiff2jp2.py
=====================================
@@ -12,6 +12,7 @@ from uuid import UUID
import warnings
# 3rd party library imports
+from PIL import Image
import numpy as np
import skimage
@@ -193,6 +194,17 @@ class TestSuite(fixtures.TestCommon):
cls.exif = path
+ def _imread(self, path, mode=None):
+
+ with Image.open(path) as img:
+
+ if mode is not None:
+ img = img.convert(mode)
+
+ imagedata = np.array(img)
+
+ return imagedata
+
def test_smoke(self):
"""
SCENARIO: Convert TIFF file to JP2
@@ -355,7 +367,7 @@ class TestSuite(fixtures.TestCommon):
j.layer = layer
d[layer] = j[:]
- truth = skimage.io.imread(self.moon)
+ truth = self._imread(self.moon)
with warnings.catch_warnings():
# MSE is zero for that first image, resulting in a divide-by-zero
@@ -394,7 +406,7 @@ class TestSuite(fixtures.TestCommon):
j.layer = layer
d[layer] = j[:]
- truth = skimage.io.imread(self.moon)
+ truth = self._imread(self.moon)
with warnings.catch_warnings():
# MSE is zero for that first image, resulting in a divide-by-zero
@@ -632,9 +644,7 @@ class TestSuite(fixtures.TestCommon):
jp2 = Jp2k(self.temp_jp2_filename)
actual = jp2[:]
- expected = skimage.io.imread(
- self.moon3_partial_last_strip, plugin='pil'
- )
+ expected = self._imread(self.moon3_partial_last_strip)
np.testing.assert_array_equal(actual, expected)
c = jp2.get_codestream()
@@ -660,9 +670,8 @@ class TestSuite(fixtures.TestCommon):
jp2 = Jp2k(self.temp_jp2_filename)
actual = jp2[:]
- expected = skimage.io.imread(
- self.moon3_partial_last_strip, plugin='pil'
- )
+ expected = self._imread(self.moon3_partial_last_strip)
+
np.testing.assert_array_equal(actual, expected)
c = jp2.get_codestream()
@@ -813,7 +822,7 @@ class TestSuite(fixtures.TestCommon):
jp2 = Jp2k(self.temp_jp2_filename)
actual = jp2[:]
- expected = skimage.io.imread(self.ycbcr_stripped, plugin='pil')
+ expected = self._imread(self.ycbcr_stripped)
np.testing.assert_array_equal(actual, expected)
c = jp2.get_codestream()
@@ -836,7 +845,7 @@ class TestSuite(fixtures.TestCommon):
jp2 = Jp2k(self.temp_jp2_filename)
actual = jp2[:]
- expected = skimage.io.imread(self.ycbcr_bg, plugin='pil')
+ expected = self._imread(self.ycbcr_bg)
np.testing.assert_array_equal(actual, expected)
c = jp2.get_codestream()
@@ -883,9 +892,8 @@ class TestSuite(fixtures.TestCommon):
jp2 = Jp2k(self.temp_jp2_filename)
actual = jp2[:]
- expected = skimage.io.imread(
- self.astronaut_ycbcr_jpeg_tiled, plugin='pil'
- )
+ expected = self._imread(self.astronaut_ycbcr_jpeg_tiled)
+
np.testing.assert_array_equal(actual, expected)
c = jp2.get_codestream()
@@ -909,9 +917,7 @@ class TestSuite(fixtures.TestCommon):
jp2 = Jp2k(self.temp_jp2_filename)
actual = jp2[:]
- expected = skimage.io.imread(
- self.astronaut_ycbcr_jpeg_tiled, plugin='pil'
- )
+ expected = self._imread(self.astronaut_ycbcr_jpeg_tiled)
np.testing.assert_array_equal(actual, expected)
c = jp2.get_codestream()
@@ -934,9 +940,7 @@ class TestSuite(fixtures.TestCommon):
jp2 = Jp2k(self.temp_jp2_filename)
actual = jp2[:]
- expected = skimage.io.imread(
- self.astronaut_ycbcr_jpeg_tiled, plugin='pil'
- )
+ expected = self._imread(self.astronaut_ycbcr_jpeg_tiled)
np.testing.assert_array_equal(actual, expected)
c = jp2.get_codestream()
@@ -1836,9 +1840,7 @@ class TestSuite(fixtures.TestCommon):
# Read in the image (as expected on little-endian), flip it
# around, prepend an alpha layer, then get rid of the last layer
# to simulate what would have happened on big-endian.
- expected = skimage.io.imread(
- self.astronaut_ycbcr_jpeg_tiled, plugin='pil'
- )
+ expected = self._imread(self.astronaut_ycbcr_jpeg_tiled)
h, w, _ = expected.shape
expected = np.flip(expected, axis=2)
A = np.ones((h, w, 1), dtype=np.uint8) * 255
@@ -1874,9 +1876,7 @@ class TestSuite(fixtures.TestCommon):
# Read in the image (as expected on little-endian), flip it
# around, prepend an alpha layer, then get rid of the last layer
# to simulate what would have happened on big-endian.
- expected = skimage.io.imread(
- self.astronaut_ycbcr_jpeg_tiled, plugin='pil'
- )
+ expected = self._imread(self.astronaut_ycbcr_jpeg_tiled)
h, w, _ = expected.shape
expected = np.flip(expected, axis=2)
A = np.ones((h, w, 1), dtype=np.uint8) * 255
@@ -1912,7 +1912,7 @@ class TestSuite(fixtures.TestCommon):
# Read in the image (as expected on little-endian), flip it
# around, prepend an alpha layer, then get rid of the last layer
# to simulate what would have happened on big-endian.
- expected = skimage.io.imread(self.ycbcr_stripped, plugin='pil')
+ expected = self._imread(self.ycbcr_stripped)
h, w, _ = expected.shape
expected = np.flip(expected, axis=2)
A = np.ones((h, w, 1), dtype=np.uint8) * 255
@@ -1935,7 +1935,7 @@ class TestSuite(fixtures.TestCommon):
jp2 = Jp2k(self.temp_jp2_filename)
actual = jp2[:]
- expected = skimage.io.imread(self.moon63)
+ expected = self._imread(self.moon63)
np.testing.assert_array_equal(actual, expected)
c = jp2.get_codestream()
View it on GitLab: https://salsa.debian.org/debian-gis-team/glymur/-/compare/30d45e8c57d276f07cc65c567d79230389aef5d3...fc8c9bd35210ae50c00f561191c285c7f925c4fa
--
View it on GitLab: https://salsa.debian.org/debian-gis-team/glymur/-/compare/30d45e8c57d276f07cc65c567d79230389aef5d3...fc8c9bd35210ae50c00f561191c285c7f925c4fa
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20250118/ed7a6e71/attachment-0001.htm>
More information about the Pkg-grass-devel
mailing list