2016-07-28 2 views
0

как проверить, соответствует ли содержимое файла тому же, что и ревизия на сервере, для JAVA API. Перед обновлением любого файла в хранилище perforce я хочу проверить, есть ли разница в содержании локального файла и файла депо. если нет никакой разницы, то игнорируйте, чтобы отправить этот файл.как взять diff двух версий файла дефолта perforce

+1

Возможный дубликат [Определить, хранятся ли два файла одного и того же контента] (http://stackoverflow.com/questions/27379059/determine-if-two-files-store-the-same-content) –

ответ

2

Я думаю, что вы хотите getDiffFiles() метод:

https://www.perforce.com/perforce/r15.1/manuals/p4java-javadoc/com/perforce/p4java/impl/mapbased/client/Client.html#getDiffFiles

В качестве альтернативы, для конкретной вещи вы находитесь делая (не отправляя неизменные файлы), просто используйте параметр отправки «leaveUnchanged», а не выполняйте ту же самую работу самостоятельно.

+0

Мне нравится этот. Я попробую установить этот параметр «leaveUnchanged» –

+0

Обратите внимание, что вы можете установить 'SubmitOptions' для каждой команды отправки отдельно или вы также можете установить' SubmitOptions' для всего своего рабочего пространства, а затем каждый подчиненный ведет себя таким образом , –

2

Да прост в использовании. Просто генерирует хеш MD5 исходного файла и перед обновлением снова генерирует хеш MD5 нового файла.

сравнить хэши обоих файлов. Если оба они одинаковы, то содержимое обоих файлов одинаково, а если нет, то они разные, и вы хорошо обновляете.

Вот это утилита для создания и проверки MD5 легко,

public class MD5Utils { 
    private static final String TAG = "MD5"; 

    public static boolean checkMD5(String md5, File updateFile) { 
     if (TextUtils.isEmpty(md5) || updateFile == null) { 
      Log.e(TAG, "MD5 string empty or updateFile null"); 
      return false; 
     } 

     String calculatedDigest = calculateMD5(updateFile); 
     if (calculatedDigest == null) { 
      Log.e(TAG, "calculatedDigest null"); 
      return false; 
     } 

     Log.v(TAG, "Calculated digest: " + calculatedDigest); 
     Log.v(TAG, "Provided digest: " + md5); 

     return calculatedDigest.equalsIgnoreCase(md5); 
    } 

    public static String calculateMD5(File updateFile) { 
     MessageDigest digest; 
     try { 
      digest = MessageDigest.getInstance("MD5"); 
     } catch (NoSuchAlgorithmException e) { 
      Log.e(TAG, "Exception while getting digest", e); 
      return null; 
     } 

     InputStream is; 
     try { 
      is = new FileInputStream(updateFile); 
     } catch (FileNotFoundException e) { 
      Log.e(TAG, "Exception while getting FileInputStream", e); 
      return null; 
     } 

     byte[] buffer = new byte[8192]; 
     int read; 
     try { 
      while ((read = is.read(buffer)) > 0) { 
       digest.update(buffer, 0, read); 
      } 
      byte[] md5sum = digest.digest(); 
      BigInteger bigInt = new BigInteger(1, md5sum); 
      String output = bigInt.toString(16); 
      // Fill to 32 chars 
      output = String.format("%32s", output).replace(' ', '0'); 
      return output; 
     } catch (IOException e) { 
      throw new RuntimeException("Unable to process file for MD5", e); 
     } finally { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       Log.e(TAG, "Exception on closing MD5 input stream", e); 
      } 
     } 
    } 
} 
+0

Спасибо за ответ , Но не можем ли мы сделать то же самое с использованием Perforce JAVA API? –

+1

Боюсь, вы не можете. Для этого вам нужно использовать стандартный JAVA api. –

+0

Спасибо за ваш быстрый ответ –

Смежные вопросы