ReflogReaderImpl.java

  1. /*
  2.  * Copyright (C) 2009, Robin Rosenberg <robin.rosenberg@dewire.com>
  3.  * and other copyright owners as documented in the project's IP log.
  4.  *
  5.  * This program and the accompanying materials are made available
  6.  * under the terms of the Eclipse Distribution License v1.0 which
  7.  * accompanies this distribution, is reproduced below, and is
  8.  * available at http://www.eclipse.org/org/documents/edl-v10.php
  9.  *
  10.  * All rights reserved.
  11.  *
  12.  * Redistribution and use in source and binary forms, with or
  13.  * without modification, are permitted provided that the following
  14.  * conditions are met:
  15.  *
  16.  * - Redistributions of source code must retain the above copyright
  17.  *   notice, this list of conditions and the following disclaimer.
  18.  *
  19.  * - Redistributions in binary form must reproduce the above
  20.  *   copyright notice, this list of conditions and the following
  21.  *   disclaimer in the documentation and/or other materials provided
  22.  *   with the distribution.
  23.  *
  24.  * - Neither the name of the Eclipse Foundation, Inc. nor the
  25.  *   names of its contributors may be used to endorse or promote
  26.  *   products derived from this software without specific prior
  27.  *   written permission.
  28.  *
  29.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
  30.  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
  31.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  32.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  33.  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  34.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  35.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  36.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  37.  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  38.  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  39.  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  40.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  41.  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  42.  */

  43. package org.eclipse.jgit.internal.storage.file;

  44. import java.io.File;
  45. import java.io.FileNotFoundException;
  46. import java.io.IOException;
  47. import java.util.ArrayList;
  48. import java.util.Collections;
  49. import java.util.List;

  50. import org.eclipse.jgit.lib.Constants;
  51. import org.eclipse.jgit.lib.ReflogEntry;
  52. import org.eclipse.jgit.lib.ReflogReader;
  53. import org.eclipse.jgit.lib.Repository;
  54. import org.eclipse.jgit.util.IO;
  55. import org.eclipse.jgit.util.RawParseUtils;

  56. /**
  57.  * Utility for reading reflog entries
  58.  */
  59. class ReflogReaderImpl implements ReflogReader {
  60.     private File logName;

  61.     /**
  62.      * @param db
  63.      * @param refname
  64.      */
  65.     ReflogReaderImpl(Repository db, String refname) {
  66.         logName = new File(db.getDirectory(), Constants.LOGS + '/' + refname);
  67.     }

  68.     /* (non-Javadoc)
  69.      * @see org.eclipse.jgit.internal.storage.file.ReflogReaader#getLastEntry()
  70.      */
  71.     /** {@inheritDoc} */
  72.     @Override
  73.     public ReflogEntry getLastEntry() throws IOException {
  74.         return getReverseEntry(0);
  75.     }

  76.     /* (non-Javadoc)
  77.      * @see org.eclipse.jgit.internal.storage.file.ReflogReaader#getReverseEntries()
  78.      */
  79.     /** {@inheritDoc} */
  80.     @Override
  81.     public List<ReflogEntry> getReverseEntries() throws IOException {
  82.         return getReverseEntries(Integer.MAX_VALUE);
  83.     }

  84.     /* (non-Javadoc)
  85.      * @see org.eclipse.jgit.internal.storage.file.ReflogReaader#getReverseEntry(int)
  86.      */
  87.     /** {@inheritDoc} */
  88.     @Override
  89.     public ReflogEntry getReverseEntry(int number) throws IOException {
  90.         if (number < 0)
  91.             throw new IllegalArgumentException();

  92.         final byte[] log;
  93.         try {
  94.             log = IO.readFully(logName);
  95.         } catch (FileNotFoundException e) {
  96.             if (logName.exists()) {
  97.                 throw e;
  98.             }
  99.             return null;
  100.         }

  101.         int rs = RawParseUtils.prevLF(log, log.length);
  102.         int current = 0;
  103.         while (rs >= 0) {
  104.             rs = RawParseUtils.prevLF(log, rs);
  105.             if (number == current)
  106.                 return new ReflogEntryImpl(log, rs < 0 ? 0 : rs + 2);
  107.             current++;
  108.         }
  109.         return null;
  110.     }

  111.     /* (non-Javadoc)
  112.      * @see org.eclipse.jgit.internal.storage.file.ReflogReaader#getReverseEntries(int)
  113.      */
  114.     /** {@inheritDoc} */
  115.     @Override
  116.     public List<ReflogEntry> getReverseEntries(int max) throws IOException {
  117.         final byte[] log;
  118.         try {
  119.             log = IO.readFully(logName);
  120.         } catch (FileNotFoundException e) {
  121.             if (logName.exists()) {
  122.                 throw e;
  123.             }
  124.             return Collections.emptyList();
  125.         }

  126.         int rs = RawParseUtils.prevLF(log, log.length);
  127.         List<ReflogEntry> ret = new ArrayList<>();
  128.         while (rs >= 0 && max-- > 0) {
  129.             rs = RawParseUtils.prevLF(log, rs);
  130.             ReflogEntry entry = new ReflogEntryImpl(log, rs < 0 ? 0 : rs + 2);
  131.             ret.add(entry);
  132.         }
  133.         return ret;
  134.     }
  135. }