diff src/org/tmatesoft/hg/internal/ChangelogMonitor.java @ 610:5c68567b3645

Refresh tags, branches, bookmarks and ignore when their files (or csets in the repo) are changed
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Thu, 09 May 2013 21:06:48 +0200
parents
children 6526d8adbc0f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/org/tmatesoft/hg/internal/ChangelogMonitor.java	Thu May 09 21:06:48 2013 +0200
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2013 TMate Software Ltd
+ *  
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * For information on how to redistribute this software under
+ * the terms of a license other than GNU General Public License
+ * contact TMate Software at support@hg4j.com
+ */
+package org.tmatesoft.hg.internal;
+
+import org.tmatesoft.hg.core.Nodeid;
+import org.tmatesoft.hg.core.SessionContext;
+import org.tmatesoft.hg.repo.HgRepository;
+
+/**
+ * Track changes to a repository based on recent changelog revision.
+ * TODO shall be merged with {@link RevlogChangeMonitor} and {@link FileChangeMonitor} into 
+ * a single facility available from {@link SessionContext}
+ * 
+ * @author Artem Tikhomirov
+ * @author TMate Software Ltd.
+ */
+public class ChangelogMonitor {
+	private final HgRepository repo;
+	private int changelogRevCount = -1;
+	private Nodeid changelogLastRev = null;
+	
+	public ChangelogMonitor(HgRepository hgRepo) {
+		repo = hgRepo;
+	}
+	
+	// memorize the state of the repository's changelog
+	public void touch() {
+		changelogRevCount = repo.getChangelog().getRevisionCount();
+		changelogLastRev = safeGetRevision(changelogRevCount-1);
+	}
+	
+	// if present state doesn't match the one we remember
+	public boolean isChanged() {
+		int rc = repo.getChangelog().getRevisionCount();
+		if (rc != changelogRevCount) {
+			return true;
+		}
+		Nodeid r = safeGetRevision(rc-1);
+		return !r.equals(changelogLastRev);
+	}
+	
+	// handles empty repository case
+	private Nodeid safeGetRevision(int revIndex) {
+		if (revIndex >= 0) {
+			return repo.getChangelog().getRevision(revIndex);
+		}
+		return Nodeid.NULL;
+	}
+}