View Javadoc
1   /*
2    * Copyright (C) 2012, Markus Duft <markus.duft@salomon.at>
3    * and other copyright owners as documented in the project's IP log.
4    *
5    * This program and the accompanying materials are made available under the
6    * terms of the Eclipse Distribution License v1.0 which accompanies this
7    * distribution, is reproduced below, and is available at
8    * 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 without
13   * modification, are permitted provided that the following conditions are met:
14   *
15   * - Redistributions of source code must retain the above copyright notice, this
16   * list of conditions and the following disclaimer.
17   *
18   * - Redistributions in binary form must reproduce the above copyright notice,
19   * this list of conditions and the following disclaimer in the documentation
20   * and/or other materials provided with the distribution.
21   *
22   * - Neither the name of the Eclipse Foundation, Inc. nor the names of its
23   * contributors may be used to endorse or promote products derived from this
24   * software without specific prior written permission.
25   *
26   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36   * POSSIBILITY OF SUCH DAMAGE.
37   */
38  package org.eclipse.jgit.lib;
39  
40  import static java.time.Instant.EPOCH;
41  import static org.junit.Assert.assertFalse;
42  import static org.junit.Assert.assertTrue;
43  
44  import java.time.Instant;
45  
46  import org.eclipse.jgit.api.Git;
47  import org.eclipse.jgit.dircache.DirCache;
48  import org.eclipse.jgit.dircache.DirCacheEntry;
49  import org.eclipse.jgit.junit.RepositoryTestCase;
50  import org.junit.Test;
51  
52  public class IndexModificationTimesTest extends RepositoryTestCase {
53  
54  	@Test
55  	public void testLastModifiedTimes() throws Exception {
56  		try (Git git = new Git(db)) {
57  			String path = "file";
58  			writeTrashFile(path, "content");
59  			String path2 = "file2";
60  			writeTrashFile(path2, "content2");
61  
62  			git.add().addFilepattern(path).call();
63  			git.add().addFilepattern(path2).call();
64  			git.commit().setMessage("commit").call();
65  
66  			DirCache dc = db.readDirCache();
67  			DirCacheEntry entry = dc.getEntry(path);
68  			DirCacheEntry entry2 = dc.getEntry(path);
69  
70  			assertFalse("last modified shall not be the epoch!",
71  					entry.getLastModifiedInstant().equals(EPOCH));
72  
73  			assertFalse("last modified shall not be the epoch!",
74  					entry2.getLastModifiedInstant().equals(EPOCH));
75  
76  			writeTrashFile(path, "new content");
77  			git.add().addFilepattern(path).call();
78  			git.commit().setMessage("commit2").call();
79  
80  			dc = db.readDirCache();
81  			entry = dc.getEntry(path);
82  			entry2 = dc.getEntry(path);
83  
84  			assertFalse("last modified shall not be the epoch!",
85  					entry.getLastModifiedInstant().equals(EPOCH));
86  
87  			assertFalse("last modified shall not be the epoch!",
88  					entry2.getLastModifiedInstant().equals(EPOCH));
89  		}
90  	}
91  
92  	@Test
93  	public void testModify() throws Exception {
94  		try (Git git = new Git(db)) {
95  			String path = "file";
96  			writeTrashFile(path, "content");
97  
98  			git.add().addFilepattern(path).call();
99  			git.commit().setMessage("commit").call();
100 
101 			DirCache dc = db.readDirCache();
102 			DirCacheEntry entry = dc.getEntry(path);
103 
104 			Instant masterLastMod = entry.getLastModifiedInstant();
105 
106 			git.checkout().setCreateBranch(true).setName("side").call();
107 
108 			Thread.sleep(10);
109 			String path2 = "file2";
110 			writeTrashFile(path2, "side content");
111 			git.add().addFilepattern(path2).call();
112 			git.commit().setMessage("commit").call();
113 
114 			dc = db.readDirCache();
115 			entry = dc.getEntry(path);
116 
117 			Instant sideLastMod = entry.getLastModifiedInstant();
118 
119 			Thread.sleep(2000);
120 
121 			writeTrashFile(path, "uncommitted content");
122 			git.checkout().setName("master").call();
123 
124 			dc = db.readDirCache();
125 			entry = dc.getEntry(path);
126 
127 			assertTrue("shall have equal mod time!",
128 					masterLastMod.equals(sideLastMod));
129 			assertTrue("shall have equal master timestamp!",
130 					entry.getLastModifiedInstant().equals(masterLastMod));
131 		}
132 	}
133 
134 }