You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

GarbageCollectCommand.java 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /*
  2. * Copyright (C) 2012, Matthias Sohn <matthias.sohn@sap.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.api;
  44. import java.io.IOException;
  45. import java.text.MessageFormat;
  46. import java.text.ParseException;
  47. import java.util.Date;
  48. import java.util.Properties;
  49. import org.eclipse.jgit.api.errors.GitAPIException;
  50. import org.eclipse.jgit.api.errors.JGitInternalException;
  51. import org.eclipse.jgit.internal.JGitText;
  52. import org.eclipse.jgit.internal.storage.file.FileRepository;
  53. import org.eclipse.jgit.internal.storage.file.GC;
  54. import org.eclipse.jgit.internal.storage.file.GC.RepoStatistics;
  55. import org.eclipse.jgit.lib.ProgressMonitor;
  56. import org.eclipse.jgit.lib.Repository;
  57. import org.eclipse.jgit.util.GitDateParser;
  58. /**
  59. * A class used to execute a {@code gc} command. It has setters for all
  60. * supported options and arguments of this command and a {@link #call()} method
  61. * to finally execute the command. Each instance of this class should only be
  62. * used for one invocation of the command (means: one call to {@link #call()})
  63. *
  64. * @since 2.2
  65. * @see <a href="http://www.kernel.org/pub/software/scm/git/docs/git-gc.html"
  66. * >Git documentation about gc</a>
  67. */
  68. public class GarbageCollectCommand extends GitCommand<Properties> {
  69. private ProgressMonitor monitor;
  70. private Date expire;
  71. /**
  72. * @param repo
  73. */
  74. protected GarbageCollectCommand(Repository repo) {
  75. super(repo);
  76. if (!(repo instanceof FileRepository))
  77. throw new UnsupportedOperationException(MessageFormat.format(
  78. JGitText.get().unsupportedGC, repo.getClass().toString()));
  79. }
  80. /**
  81. * @param monitor
  82. * a progress monitor
  83. * @return this instance
  84. */
  85. public GarbageCollectCommand setProgressMonitor(ProgressMonitor monitor) {
  86. this.monitor = monitor;
  87. return this;
  88. }
  89. /**
  90. * During gc() or prune() each unreferenced, loose object which has been
  91. * created or modified after <code>expire</code> will not be pruned. Only
  92. * older objects may be pruned. If set to null then every object is a
  93. * candidate for pruning. Use {@link GitDateParser} to parse time formats
  94. * used by git gc.
  95. *
  96. * @param expire
  97. * minimal age of objects to be pruned.
  98. * @return this instance
  99. */
  100. public GarbageCollectCommand setExpire(Date expire) {
  101. this.expire = expire;
  102. return this;
  103. }
  104. @Override
  105. public Properties call() throws GitAPIException {
  106. checkCallable();
  107. GC gc = new GC((FileRepository) repo);
  108. gc.setProgressMonitor(monitor);
  109. if (this.expire != null)
  110. gc.setExpire(expire);
  111. try {
  112. gc.gc();
  113. return toProperties(gc.getStatistics());
  114. } catch (IOException e) {
  115. throw new JGitInternalException(JGitText.get().gcFailed, e);
  116. } catch (ParseException e) {
  117. throw new JGitInternalException(JGitText.get().gcFailed, e);
  118. }
  119. }
  120. /**
  121. * Computes and returns the repository statistics.
  122. *
  123. * @return the repository statistics
  124. * @throws GitAPIException
  125. * thrown if the repository statistics cannot be computed
  126. * @since 3.0
  127. */
  128. public Properties getStatistics() throws GitAPIException {
  129. try {
  130. GC gc = new GC((FileRepository) repo);
  131. return toProperties(gc.getStatistics());
  132. } catch (IOException e) {
  133. throw new JGitInternalException(
  134. JGitText.get().couldNotGetRepoStatistics, e);
  135. }
  136. }
  137. @SuppressWarnings("boxing")
  138. private static Properties toProperties(RepoStatistics stats) {
  139. Properties p = new Properties();
  140. p.put("numberOfLooseObjects", stats.numberOfLooseObjects); //$NON-NLS-1$
  141. p.put("numberOfLooseRefs", stats.numberOfLooseRefs); //$NON-NLS-1$
  142. p.put("numberOfPackedObjects", stats.numberOfPackedObjects); //$NON-NLS-1$
  143. p.put("numberOfPackedRefs", stats.numberOfPackedRefs); //$NON-NLS-1$
  144. p.put("numberOfPackFiles", stats.numberOfPackFiles); //$NON-NLS-1$
  145. p.put("sizeOfLooseObjects", stats.sizeOfLooseObjects); //$NON-NLS-1$
  146. p.put("sizeOfPackedObjects", stats.sizeOfPackedObjects); //$NON-NLS-1$
  147. return p;
  148. }
  149. }