Coverage Report

Created: 2026-07-25 06:50

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/apps/gdalalg_vsi_delete.cpp
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Project:  GDAL
4
 * Purpose:  gdal "vsi delete" subcommand
5
 * Author:   Even Rouault <even dot rouault at spatialys.com>
6
 *
7
 ******************************************************************************
8
 * Deleteright (c) 2025, Even Rouault <even dot rouault at spatialys.com>
9
 *
10
 * SPDX-License-Identifier: MIT
11
 ****************************************************************************/
12
13
#include "gdalalg_vsi_delete.h"
14
15
#include "cpl_conv.h"
16
#include "cpl_string.h"
17
#include "cpl_vsi.h"
18
#include "cpl_vsi_error.h"
19
20
#include <algorithm>
21
22
//! @cond Doxygen_Suppress
23
24
#ifndef _
25
0
#define _(x) (x)
26
#endif
27
28
/************************************************************************/
29
/*           GDALVSIDeleteAlgorithm::GDALVSIDeleteAlgorithm()           */
30
/************************************************************************/
31
32
GDALVSIDeleteAlgorithm::GDALVSIDeleteAlgorithm()
33
0
    : GDALAlgorithm(NAME, DESCRIPTION, HELP_URL)
34
0
{
35
0
    AddProgressArg(/* hidden = */ true);
36
37
0
    {
38
0
        auto &arg = AddArg("filename", 0, _("File or directory name to delete"),
39
0
                           &m_filename)
40
0
                        .SetPositional()
41
0
                        .SetMinCharCount(1)
42
0
                        .SetRequired();
43
0
        SetAutoCompleteFunctionForFilename(arg, 0);
44
0
    }
45
46
0
    AddArg("recursive", 'r', _("Delete directories recursively"), &m_recursive)
47
0
        .AddShortNameAlias('R');
48
0
}
49
50
/************************************************************************/
51
/*                  GDALVSIDeleteAlgorithm::RunImpl()                   */
52
/************************************************************************/
53
54
bool GDALVSIDeleteAlgorithm::RunImpl(GDALProgressFunc, void *)
55
0
{
56
0
    bool ret = false;
57
0
    VSIStatBufL sStat;
58
0
    VSIErrorReset();
59
0
    const auto nOldErrorNum = VSIGetLastErrorNo();
60
0
    if (VSIStatL(m_filename.c_str(), &sStat) != 0)
61
0
    {
62
0
        if (nOldErrorNum != VSIGetLastErrorNo())
63
0
        {
64
0
            ReportError(CE_Failure, CPLE_FileIO,
65
0
                        "'%s' cannot be accessed. %s: %s", m_filename.c_str(),
66
0
                        VSIErrorNumToString(VSIGetLastErrorNo()),
67
0
                        VSIGetLastErrorMsg());
68
0
        }
69
0
        else
70
0
        {
71
0
            ReportError(CE_Failure, CPLE_FileIO,
72
0
                        "'%s' does not exist or cannot be accessed",
73
0
                        m_filename.c_str());
74
0
        }
75
0
    }
76
0
    else
77
0
    {
78
0
        if (m_recursive)
79
0
        {
80
0
            ret = VSIRmdirRecursive(m_filename.c_str()) == 0;
81
0
        }
82
0
        else
83
0
        {
84
0
            ret = VSI_ISDIR(sStat.st_mode) ? VSIRmdir(m_filename.c_str()) == 0
85
0
                                           : VSIUnlink(m_filename.c_str()) == 0;
86
0
        }
87
0
        if (!ret)
88
0
        {
89
0
            ReportError(CE_Failure, CPLE_FileIO, "Cannot delete %s",
90
0
                        m_filename.c_str());
91
0
        }
92
0
    }
93
0
    return ret;
94
0
}
95
96
//! @endcond