Package org.eclipse.jgit.patch

Source Code of org.eclipse.jgit.patch.EGitPatchHistoryTest$PatchReader

/*
* Copyright (C) 2008-2009, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
*   notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
*   copyright notice, this list of conditions and the following
*   disclaimer in the documentation and/or other materials provided
*   with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
*   names of its contributors may be used to endorse or promote
*   products derived from this software without specific prior
*   written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.eclipse.jgit.patch;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.HashSet;

import junit.framework.TestCase;

import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.util.MutableInteger;
import org.eclipse.jgit.util.RawParseUtils;
import org.eclipse.jgit.util.TemporaryBuffer;

public class EGitPatchHistoryTest extends TestCase {
  public void testParseHistory() throws Exception {
    final NumStatReader numstat = new NumStatReader();
    numstat.read();

    final HashMap<String, HashMap<String, StatInfo>> stats = numstat.stats;
    assertEquals(1211, stats.size());

    new PatchReader(stats).read();
  }

  static class StatInfo {
    int added, deleted;
  }

  static class PatchReader extends CommitReader {
    final HashSet<String> offBy1;

    final HashMap<String, HashMap<String, StatInfo>> stats;

    int errors;

    PatchReader(final HashMap<String, HashMap<String, StatInfo>> s)
        throws IOException {
      super(new String[] { "-p" });
      stats = s;

      offBy1 = new HashSet<String>();
      offBy1.add("9bda5ece6806cd797416eaa47c7b927cc6e9c3b2");
    }

    @Override
    void onCommit(String cid, byte[] buf) {
      final HashMap<String, StatInfo> files = stats.remove(cid);
      assertNotNull("No files for " + cid, files);

      final Patch p = new Patch();
      p.parse(buf, 0, buf.length - 1);
      assertEquals("File count " + cid, files.size(), p.getFiles().size());
      if (!p.getErrors().isEmpty()) {
        for (final FormatError e : p.getErrors()) {
          System.out.println("error " + e.getMessage());
          System.out.println("  at " + e.getLineText());
        }
        dump(buf);
        fail("Unexpected error in " + cid);
      }

      for (final FileHeader fh : p.getFiles()) {
        final String fileName;
        if (fh.getChangeType() != FileHeader.ChangeType.DELETE)
          fileName = fh.getNewPath();
        else
          fileName = fh.getOldPath();
        final StatInfo s = files.remove(fileName);
        final String nid = fileName + " in " + cid;
        assertNotNull("No " + nid, s);
        int added = 0, deleted = 0;
        for (final HunkHeader h : fh.getHunks()) {
          added += h.getOldImage().getLinesAdded();
          deleted += h.getOldImage().getLinesDeleted();
        }

        if (s.added == added) {
          //
        } else if (s.added == added + 1 && offBy1.contains(cid)) {
          //
        } else {
          dump(buf);
          assertEquals("Added diff in " + nid, s.added, added);
        }

        if (s.deleted == deleted) {
          //
        } else if (s.deleted == deleted + 1 && offBy1.contains(cid)) {
          //
        } else {
          dump(buf);
          assertEquals("Deleted diff in " + nid, s.deleted, deleted);
        }
      }
      assertTrue("Missed files in " + cid, files.isEmpty());
    }

    private static void dump(final byte[] buf) {
      String str;
      try {
        str = new String(buf, 0, buf.length - 1, "ISO-8859-1");
      } catch (UnsupportedEncodingException e) {
        throw new RuntimeException(e);
      }
      System.out.println("<<" + str + ">>");
    }
  }

  static class NumStatReader extends CommitReader {
    final HashMap<String, HashMap<String, StatInfo>> stats = new HashMap<String, HashMap<String, StatInfo>>();

    NumStatReader() throws IOException {
      super(new String[] { "--numstat" });
    }

    @Override
    void onCommit(String commitId, byte[] buf) {
      final HashMap<String, StatInfo> files = new HashMap<String, StatInfo>();
      final MutableInteger ptr = new MutableInteger();
      while (ptr.value < buf.length) {
        if (buf[ptr.value] == '\n')
          break;
        final StatInfo i = new StatInfo();
        i.added = RawParseUtils.parseBase10(buf, ptr.value, ptr);
        i.deleted = RawParseUtils.parseBase10(buf, ptr.value + 1, ptr);
        final int eol = RawParseUtils.nextLF(buf, ptr.value);
        final String name = RawParseUtils.decode(Constants.CHARSET,
            buf, ptr.value + 1, eol - 1);
        files.put(name, i);
        ptr.value = eol;
      }
      stats.put(commitId, files);
    }
  }

  static abstract class CommitReader {
    private Process proc;

    CommitReader(final String[] args) throws IOException {
      final String[] realArgs = new String[3 + args.length + 1];
      realArgs[0] = "git";
      realArgs[1] = "log";
      realArgs[2] = "--pretty=format:commit %H";
      System.arraycopy(args, 0, realArgs, 3, args.length);
      realArgs[3 + args.length] = "a4b98ed15ea5f165a7aa0f2fd2ea6fcce6710925";

      proc = Runtime.getRuntime().exec(realArgs);
      proc.getOutputStream().close();
      proc.getErrorStream().close();
    }

    void read() throws IOException, InterruptedException {
      final BufferedReader in = new BufferedReader(new InputStreamReader(
          proc.getInputStream(), "ISO-8859-1"));
      String commitId = null;
      TemporaryBuffer buf = null;
      for (;;) {
        String line = in.readLine();
        if (line == null)
          break;
        if (line.startsWith("commit ")) {
          if (buf != null) {
            buf.close();
            onCommit(commitId, buf.toByteArray());
            buf.destroy();
          }
          commitId = line.substring("commit ".length());
          buf = new TemporaryBuffer.LocalFile();
        } else if (buf != null) {
          buf.write(line.getBytes("ISO-8859-1"));
          buf.write('\n');
        }
      }
      in.close();
      assertEquals(0, proc.waitFor());
      proc = null;
    }

    abstract void onCommit(String commitId, byte[] buf);
  }
}
TOP

Related Classes of org.eclipse.jgit.patch.EGitPatchHistoryTest$PatchReader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.