2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com
.intellij
.cvsSupport2
.cvsstatuses
;
18 import com
.intellij
.cvsSupport2
.CvsUtil
;
19 import com
.intellij
.cvsSupport2
.application
.CvsEntriesManager
;
20 import com
.intellij
.cvsSupport2
.util
.CvsVfsUtil
;
21 import com
.intellij
.openapi
.application
.ApplicationManager
;
22 import com
.intellij
.openapi
.diagnostic
.Logger
;
23 import com
.intellij
.openapi
.vcs
.FileStatus
;
24 import com
.intellij
.openapi
.vfs
.VirtualFile
;
25 import org
.jetbrains
.annotations
.NotNull
;
26 import org
.netbeans
.lib
.cvsclient
.admin
.Entry
;
28 import java
.util
.Date
;
33 public class CvsStatusProvider
{
34 private static final Logger LOG
= Logger
.getInstance("#com.intellij.cvsSupport2.cvsstatuses.CvsStatusProvider");
36 private static long TIME_STAMP_EPSILON
= 3000;
38 private CvsStatusProvider() {}
40 public static void changeTimeStampEpsilonTo(long epsilon
) {
41 LOG
.assertTrue(ApplicationManager
.getApplication().isUnitTestMode());
42 TIME_STAMP_EPSILON
= epsilon
;
45 public static FileStatus
getStatus(@NotNull VirtualFile file
) {
46 if (!CvsEntriesManager
.getInstance().isActive()) return FileStatus
.NOT_CHANGED
;
47 return getStatus(file
, CvsEntriesManager
.getInstance().getEntryFor(file
.getParent(), file
.getName()));
50 public static FileStatus
getStatus(VirtualFile file
, Entry entry
) {
52 return getFileStatusForAbsentFile(entry
);
56 return getFileStatusForAbsentEntry(file
);
59 if (entry
.isDirectory()) {
60 return FileStatus
.NOT_CHANGED
;
63 if (entry
.isAddedFile()) {
64 return FileStatus
.ADDED
;
67 if (entry
.isRemoved()) {
68 return FileStatus
.DELETED
;
71 if (entry
.isResultOfMerge()) {
72 if (entry
.isConflict()) {
73 return FileStatus
.MERGED_WITH_CONFLICTS
;
76 return FileStatus
.MERGE
;
80 Date revisionDate
= entry
.getLastModified();
82 if (revisionDate
== null) {
83 return FileStatus
.MODIFIED
;
86 final long entryDate
= revisionDate
.getTime();
87 final long fileDate
= CvsVfsUtil
.getTimeStamp(file
);
88 if (LOG
.isDebugEnabled()) {
89 LOG
.debug("getStatus() for " + file
.getPath() + ": entry date " + entryDate
+ ", file date " + fileDate
);
91 return (timeStampsAreEqual(entryDate
, fileDate
)) ? FileStatus
.NOT_CHANGED
: FileStatus
.MODIFIED
;
95 private static FileStatus
getFileStatusForAbsentFile(Entry entry
) {
96 if (entry
== null || entry
.isDirectory()) {
97 return FileStatus
.UNKNOWN
;
99 if (entry
.isRemoved()) {
100 return FileStatus
.DELETED
;
102 return FileStatus
.DELETED_FROM_FS
;
105 private static FileStatus
getFileStatusForAbsentEntry(VirtualFile file
) {
107 return FileStatus
.UNKNOWN
;
110 if (CvsEntriesManager
.getInstance().fileIsIgnored(file
)) {
111 return FileStatus
.IGNORED
;
114 if (file
.isDirectory() && CvsUtil
.fileIsUnderCvs(file
)) {
115 return FileStatus
.NOT_CHANGED
;
118 return FileStatus
.UNKNOWN
;
121 public static boolean timeStampsAreEqual(long revisionTime
, long fileTimestamp
) {
122 long diff
= Math
.abs(revisionTime
- fileTimestamp
);
123 return isZero(diff
) || isZero(Math
.abs(diff
- 3600000));
126 private static boolean isZero(long diff
) {
127 return diff
< TIME_STAMP_EPSILON
;
130 public static Date
createDateDiffersTo(long timeStamp
) {
131 return new Date(timeStamp
- CvsStatusProvider
.TIME_STAMP_EPSILON
- 1);