<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>53954</bug_id>
          
          <creation_ts>2025-04-23 12:52:59 +0300</creation_ts>
          <short_desc>При замене файла не удаляется старый</short_desc>
          <delta_ts>2025-12-04 17:03:49 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>gpupdate</component>
          <version>unstable</version>
          <rep_platform>x86_64</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>NEW</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P5</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Vladislav Glinkin">glinkinvd</reporter>
          <assigned_to name="Valery Sinelnikov">greh</assigned_to>
          <cc>greh</cc>
    
    <cc>kotjuhovma</cc>
    
    <cc>nir</cc>
    
    <cc>sin</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>263414</commentid>
    <comment_count>0</comment_count>
    <who name="Vladislav Glinkin">glinkinvd</who>
    <bug_when>2025-04-23 12:52:59 +0300</bug_when>
    <thetext>Версия: gpupdate-0.13.2-alt1

Предварительно:
- Настроены механизмы GPUpdate для управления файлами
- Включены экспериментальные политики

Шаги воспроизведения:
1) В GPUI создать файл для пользователя с местом назначения %DesktopDir%/test.txt
2) Выполнить gpupdate на клиентской машине доменным пользователем
3) Изменить ранее созданный файл, поменяв место назначения на %DesktopDir%/test3.txt и действие на &quot;Заменить&quot;
4) Повторить 2 шаг

Фактический результат:
Создан %DesktopDir%/test3.txt, прошлый %DesktopDir%/test.txt не удалён.

Ожидаемый результат:
Создан %DesktopDir%/test3.txt, прошлый %DesktopDir%/test.txt удалён.

====

Метод act() класса Files_cp:
    def act(self):
        if self.action == FileAction.CREATE:
            self._create_action()
        if self.action == FileAction.UPDATE:
            self._update_action()
        if self.action == FileAction.DELETE:
            self._delete_action()
        if self.action == FileAction.REPLACE:
            self._delete_action()
            self._create_action()

Метод _delete_action() класса Files_cp:
    def _delete_action(self):
        list_target = [self.targetPath.name]
        if self.is_pattern(self.targetPath.name) and self.targetPath.parent.exists() and self.targetPath.parent.is_dir():
            list_target = fnmatch.filter([str(x.name) for x in self.targetPath.parent.iterdir() if x.is_file()], self.targetPath.name)
        logdata = dict()
        for targetFile in list_target:
            targetFile = self.targetPath.parent.joinpath(targetFile)
            try:
                if targetFile.exists():
                    targetFile.unlink()
                    logdata[&apos;File&apos;] = targetFile
                    log(&apos;D193&apos;, logdata)

            except Exception as exc:
                logdata[&apos;exc&apos;] = exc
                logdata[&apos;targetPath&apos;] = self.targetPath
                logdata[&apos;targetFile&apos;] = targetFile
                log(&apos;D165&apos;, logdata)

Информацию о файлах получаем из dconf, но не обрабатываем прошлое значение, из-за чего при self.action == FileAction.REPLACE выполняется только self._create_action(), хотя по задумке старый файл должен удаляться, а новый создаваться.

На нашем вики написано, что &quot;Групповая политика «Файлы» (Files) позволяет проводить операции с файлами: копировать файлы в нужное расположение, удалять, заменять, обновлять (атрибуты) файлов&quot;.
В перечне возможностей:
&quot;удалить файл (или несколько файлов в одном каталоге) и заменить его копией файла из исходного каталога;&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>263484</commentid>
    <comment_count>1</comment_count>
    <who name="Valery Sinelnikov">greh</who>
    <bug_when>2025-04-24 13:36:25 +0300</bug_when>
    <thetext>Действительно, в текущей реализации обработки политик при действии REPLACE отсутствует удаление предыдущей версии. Раньше gpupdate не сохранял предыдущие состояния политик, поэтому логика замены ограничивалась только применением новых значений. Теперь, когда в dconf хранятся предыдущие настройки, можно (и нужно) доработать обработку REPLACE, чтобы она учитывала старые параметры и выполняла полную замену в соответствии с ожидаемым поведением.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>278495</commentid>
    <comment_count>2</comment_count>
    <who name="Котюхов Михаил Андреевич">kotjuhovma</who>
    <bug_when>2025-12-04 17:03:49 +0300</bug_when>
    <thetext>Актуально для версии gpupdate-0.14.0-alt1
 
Воспроизводится на системах,обновленных до sisyphus:
 kworkstation-11.1.1-x86-64
 education-11.0-x86-64-kde
 education-11.0-x86-64-xfce
 workstation-11.1-x86-64</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>