Skip to content

Commit 821aad4

Browse files
committed
[processing][gdal] Fix ogrinfo algorithm fails when path name has spaces
Fixes #19655 (cherry-picked from d0a705f)
1 parent 9c3f053 commit 821aad4

File tree

4 files changed

+159
-2
lines changed

4 files changed

+159
-2
lines changed

python/plugins/processing/algs/gdal/ogrinfo.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def commandName(self):
7474
return 'ogrinfo'
7575

7676
def getConsoleCommands(self, parameters, context, feedback, executing=True):
77-
arguments = [self.commandName(), '-al']
77+
arguments = ['-al']
7878

7979
if self.parameterAsBool(parameters, self.SUMMARY_ONLY, context):
8080
arguments.append('-so')
@@ -87,7 +87,7 @@ def getConsoleCommands(self, parameters, context, feedback, executing=True):
8787

8888
connectionString = GdalUtils.ogrConnectionString(inLayer.source(), context)
8989
arguments.append(connectionString)
90-
return arguments
90+
return [self.commandName(), GdalUtils.escapeAndJoin(arguments)]
9191

9292
def processAlgorithm(self, parameters, context, feedback):
9393
GdalUtils.runGdal(self.getConsoleCommands(parameters, context, feedback), feedback)

python/plugins/processing/tests/GdalAlgorithmsTest.py

+43
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
from processing.algs.gdal.buildvrt import buildvrt
4545
from processing.algs.gdal.hillshade import hillshade
4646
from processing.algs.gdal.ogr2ogr import ogr2ogr
47+
from processing.algs.gdal.ogrinfo import ogrinfo
4748
from processing.algs.gdal.proximity import proximity
4849
from processing.algs.gdal.rasterize import rasterize
4950
from processing.algs.gdal.retile import retile
@@ -1092,6 +1093,48 @@ def testOgr2Ogr(self):
10921093
'-f "LIBKML" "d:/temp/my out/check.kml" ' +
10931094
source + ' polys2'])
10941095

1096+
def testOgrInfo(self):
1097+
context = QgsProcessingContext()
1098+
feedback = QgsProcessingFeedback()
1099+
source = os.path.join(testDataPath, 'polys.gml')
1100+
alg = ogrinfo()
1101+
alg.initAlgorithm()
1102+
1103+
self.assertEqual(
1104+
alg.getConsoleCommands({'INPUT': source,
1105+
'SUMMARY_ONLY': True,
1106+
'NO_METADATA': False}, context, feedback),
1107+
['ogrinfo',
1108+
'-al -so ' +
1109+
source])
1110+
1111+
source = os.path.join(testDataPath, 'filename with spaces.gml')
1112+
self.assertEqual(
1113+
alg.getConsoleCommands({'INPUT': source,
1114+
'SUMMARY_ONLY': True,
1115+
'NO_METADATA': False}, context, feedback),
1116+
['ogrinfo',
1117+
'-al -so "' +
1118+
source + '"'])
1119+
1120+
source = os.path.join(testDataPath, 'filename with spaces.gml')
1121+
self.assertEqual(
1122+
alg.getConsoleCommands({'INPUT': source,
1123+
'SUMMARY_ONLY': False,
1124+
'NO_METADATA': False}, context, feedback),
1125+
['ogrinfo',
1126+
'-al "' +
1127+
source + '"'])
1128+
1129+
source = os.path.join(testDataPath, 'filename with spaces.gml')
1130+
self.assertEqual(
1131+
alg.getConsoleCommands({'INPUT': source,
1132+
'SUMMARY_ONLY': True,
1133+
'NO_METADATA': True}, context, feedback),
1134+
['ogrinfo',
1135+
'-al -so -nomd "' +
1136+
source + '"'])
1137+
10951138
def testHillshade(self):
10961139
context = QgsProcessingContext()
10971140
feedback = QgsProcessingFeedback()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<ogr:FeatureCollection
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://ogr.maptools.org/ filename with spaces.xsd"
5+
xmlns:ogr="http://ogr.maptools.org/"
6+
xmlns:gml="http://www.opengis.net/gml">
7+
<gml:boundedBy>
8+
<gml:Box>
9+
<gml:coord><gml:X>0</gml:X><gml:Y>-5</gml:Y></gml:coord>
10+
<gml:coord><gml:X>8</gml:X><gml:Y>3</gml:Y></gml:coord>
11+
</gml:Box>
12+
</gml:boundedBy>
13+
14+
<gml:featureMember>
15+
<ogr:filename_with_spaces fid="points.0">
16+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>1,1</gml:coordinates></gml:Point></ogr:geometryProperty>
17+
<ogr:id>1</ogr:id>
18+
<ogr:id2>2</ogr:id2>
19+
</ogr:filename_with_spaces>
20+
</gml:featureMember>
21+
<gml:featureMember>
22+
<ogr:filename_with_spaces fid="points.1">
23+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>3,3</gml:coordinates></gml:Point></ogr:geometryProperty>
24+
<ogr:id>2</ogr:id>
25+
<ogr:id2>1</ogr:id2>
26+
</ogr:filename_with_spaces>
27+
</gml:featureMember>
28+
<gml:featureMember>
29+
<ogr:filename_with_spaces fid="points.2">
30+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>2,2</gml:coordinates></gml:Point></ogr:geometryProperty>
31+
<ogr:id>3</ogr:id>
32+
<ogr:id2>0</ogr:id2>
33+
</ogr:filename_with_spaces>
34+
</gml:featureMember>
35+
<gml:featureMember>
36+
<ogr:filename_with_spaces fid="points.3">
37+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>5,2</gml:coordinates></gml:Point></ogr:geometryProperty>
38+
<ogr:id>4</ogr:id>
39+
<ogr:id2>2</ogr:id2>
40+
</ogr:filename_with_spaces>
41+
</gml:featureMember>
42+
<gml:featureMember>
43+
<ogr:filename_with_spaces fid="points.4">
44+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>4,1</gml:coordinates></gml:Point></ogr:geometryProperty>
45+
<ogr:id>5</ogr:id>
46+
<ogr:id2>1</ogr:id2>
47+
</ogr:filename_with_spaces>
48+
</gml:featureMember>
49+
<gml:featureMember>
50+
<ogr:filename_with_spaces fid="points.5">
51+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>0,-5</gml:coordinates></gml:Point></ogr:geometryProperty>
52+
<ogr:id>6</ogr:id>
53+
<ogr:id2>0</ogr:id2>
54+
</ogr:filename_with_spaces>
55+
</gml:featureMember>
56+
<gml:featureMember>
57+
<ogr:filename_with_spaces fid="points.6">
58+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>8,-1</gml:coordinates></gml:Point></ogr:geometryProperty>
59+
<ogr:id>7</ogr:id>
60+
<ogr:id2>0</ogr:id2>
61+
</ogr:filename_with_spaces>
62+
</gml:featureMember>
63+
<gml:featureMember>
64+
<ogr:filename_with_spaces fid="points.7">
65+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>7,-1</gml:coordinates></gml:Point></ogr:geometryProperty>
66+
<ogr:id>8</ogr:id>
67+
<ogr:id2>0</ogr:id2>
68+
</ogr:filename_with_spaces>
69+
</gml:featureMember>
70+
<gml:featureMember>
71+
<ogr:filename_with_spaces fid="points.8">
72+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>0,-1</gml:coordinates></gml:Point></ogr:geometryProperty>
73+
<ogr:id>9</ogr:id>
74+
<ogr:id2>0</ogr:id2>
75+
</ogr:filename_with_spaces>
76+
</gml:featureMember>
77+
</ogr:FeatureCollection>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<xs:schema targetNamespace="http://ogr.maptools.org/" xmlns:ogr="http://ogr.maptools.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="1.0">
3+
<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd"/>
4+
<xs:element name="FeatureCollection" type="ogr:FeatureCollectionType" substitutionGroup="gml:_FeatureCollection"/>
5+
<xs:complexType name="FeatureCollectionType">
6+
<xs:complexContent>
7+
<xs:extension base="gml:AbstractFeatureCollectionType">
8+
<xs:attribute name="lockId" type="xs:string" use="optional"/>
9+
<xs:attribute name="scope" type="xs:string" use="optional"/>
10+
</xs:extension>
11+
</xs:complexContent>
12+
</xs:complexType>
13+
<xs:element name="filename_with_spaces" type="ogr:filename_with_spaces_Type" substitutionGroup="gml:_Feature"/>
14+
<xs:complexType name="filename_with_spaces_Type">
15+
<xs:complexContent>
16+
<xs:extension base="gml:AbstractFeatureType">
17+
<xs:sequence>
18+
<xs:element name="geometryProperty" type="gml:PointPropertyType" nillable="true" minOccurs="0" maxOccurs="1"/>
19+
<xs:element name="id" nillable="true" minOccurs="0" maxOccurs="1">
20+
<xs:simpleType>
21+
<xs:restriction base="xs:integer">
22+
<xs:totalDigits value="10"/>
23+
</xs:restriction>
24+
</xs:simpleType>
25+
</xs:element>
26+
<xs:element name="id2" nillable="true" minOccurs="0" maxOccurs="1">
27+
<xs:simpleType>
28+
<xs:restriction base="xs:integer">
29+
<xs:totalDigits value="10"/>
30+
</xs:restriction>
31+
</xs:simpleType>
32+
</xs:element>
33+
</xs:sequence>
34+
</xs:extension>
35+
</xs:complexContent>
36+
</xs:complexType>
37+
</xs:schema>

0 commit comments

Comments
 (0)