Установщик / SVN используется для развертывания файлов данных приложения, когда мои файлы и / или их изменились - PullRequest
0 голосов
/ 02 февраля 2011

Я попадаю в беспорядок с использованием Tortoise SVN / Innosetup и своей собственной гордостью, пытаясь сохранить изменения данных клиентов, и буду признателен за некоторые предложения. Вот проблема:

Я развертываю приложение, которое устанавливает его файлы данных, и в ходе установки я установил, что установщик помечает эти файлы «волшебным» временем (01-01-1991 00:00:00). Некоторые файлы данных будут впоследствии изменены моим клиентом, в результате чего их дата будет более поздней, чем моя «волшебная» дата. Поскольку я не хочу отсеивать изменения клиентов, я использую «COMPARETIMESTAMP» в Innosetup (хотя это «не рекомендуется»). Это работало хорошо, пока мне не пришлось развернуть изменение в одном из моих файлов, и в этом случае мне нужно игнорировать отметку времени, если только клиент не изменил ее.

Эта ситуация применима ко всем типам файлов, например, к текстовым файлам, в которых отсутствует версия, только дата и время.

В качестве еще одного ограничения моя отметка даты и времени должна происходить в сценарии установки, поскольку SVN не гарантирует (и не должна) гарантировать дату и время файла позже.

Мне не хватает лучшего подхода? Что другие делают с этим? Спасибо

1 Ответ

0 голосов
/ 04 февраля 2011

Ну, я нашел ответ на эту проблему и придумал этот метод, который я воспроизвел здесь на случай, если он пригодится. Что он делает:

  1. Если конечный пользователь изменил файл назначения, отобразите сообщение, по умолчанию оставив его в покое.

  2. Если конечный пользователь НЕ изменил целевой файл, всегда заменяйте его.

Для этого вам нужно использовать настройки скрипта:

[Setup]

; A 'magic' date time
TouchDate=1991-01-01
TouchTime=01:01

Когда происходит установка, все «мои» файлы имеют отметку 01.01.1991 01:01, что делает его полезным для проверки и позволяет мне использовать следующие две строки в разделе [Файлы] для любого файла который конечный пользователь может редактировать, например:

[Files]
Source: "...\*.*"; DestDir: <DestDir>; Flags: touch recursesubdirs createallsubdirs overwritereadonly comparetimestamp promptifolder;
Source: "...\*.*"; DestDir: <DestDir>; Flags: touch recursesubdirs  createallsubdirs overwritereadonly; Check: IsMagic;

Обе строки пытаются установить файл, но вторая строка устанавливает файл с использованием разностных флагов, если файл все еще «один из моих» с использованием функции проверки «IsMagic». Функция IsMagic объявлена ​​в коде следующим образом:

[Code]

// ------------------------------------------------------------------------------------

function FileNameToLastWriteTime( const AFileName : string ) : TFileTime;
// Returns the file time of the last write to this file
var
  FindRec : TFindRec;
begin
  Result.dwLowDateTime := 0;
  Result.dwHighDateTime := 0;
  try
    If FindFirst( AFileName, FindRec ) then
      Result := FindRec.LastWriteTime;
  finally
    FindClose(FindRec);
  end;
end;

// ------------------------------------------------------------------------------------



// ------------------------------------------------------------------------------------

function IsMagic : boolean;
// This returns TRUE if the file date/time shows it to be an 'ART magic' file, i.e it
// has a date/time stamp that has not been changed by the customer. Typically an ART magic
// file is stamped to '1-1-1991 01:01'. This routine returns TRUE if the current file
// date/time is no later than 31/12/1991 23:59:42.569 corresponding to file time of
// H=28728269, L=0.
var
  Time : TFileTime;
  S : string;
begin
  S := CurrentFileName;
  Time := FileNameToLastWriteTime( S );
  Result := Time.dwHighDateTime <= 28728269;
end;
// ------------------------------------------------------------------------------------

Надеюсь, это пригодится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...