Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
184 changes: 132 additions & 52 deletions src/GitHub.Api/Events/RepositoryWatcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -162,12 +162,7 @@ public int CheckAndProcessEvents()

private int ProcessEvents(Event[] fileEvents)
{
var eventsProcessed = 0;
var configChanged = false;
var headChanged = false;
var repositoryChanged = false;
var indexChanged = false;

Dictionary<EventType, List<EventData>> events = new Dictionary<EventType, List<EventData>>();
foreach (var fileEvent in fileEvents)
{
if (!running)
Expand Down Expand Up @@ -195,29 +190,17 @@ private int ProcessEvents(Event[] fileEvents)
// handling events in .git/*
if (fileA.IsChildOf(paths.DotGitPath))
{
if (!configChanged && fileA.Equals(paths.DotGitConfig))
if (!events.ContainsKey(EventType.ConfigChanged) && fileA.Equals(paths.DotGitConfig))
{
configChanged = true;

Logger.Trace("ConfigChanged");
ConfigChanged?.Invoke();
eventsProcessed++;
events.Add(EventType.ConfigChanged, null);
}
else if (!headChanged && fileA.Equals(paths.DotGitHead))
else if (!events.ContainsKey(EventType.HeadChanged) && fileA.Equals(paths.DotGitHead))
{
headChanged = true;

Logger.Trace("HeadChanged");
HeadChanged?.Invoke();
eventsProcessed++;
events.Add(EventType.HeadChanged, null);
}
else if (!indexChanged && fileA.Equals(paths.DotGitIndex))
else if (!events.ContainsKey(EventType.IndexChanged) && fileA.Equals(paths.DotGitIndex))
{
indexChanged = true;

Logger.Trace("IndexChanged");
IndexChanged?.Invoke();
eventsProcessed++;
events.Add(EventType.IndexChanged, null);
}
else if (fileA.IsChildOf(paths.RemotesPath))
{
Expand All @@ -231,20 +214,17 @@ private int ProcessEvents(Event[] fileEvents)

var origin = relativePathElements[0];

if (fileEvent.Type == EventType.DELETED)
if (fileEvent.Type == sfw.net.EventType.DELETED)
{
if (fileA.ExtensionWithDot == ".lock")
{
continue;
}

var branch = string.Join(@"/", relativePathElements.Skip(1).ToArray());

Logger.Trace("RemoteBranchDeleted: {0}/{1}", origin, branch);
RemoteBranchDeleted?.Invoke(origin, branch);
eventsProcessed++;
AddOrUpdateEventData(events, EventType.RemoteBranchDeleted, new EventData { Origin = origin, Branch = branch });
}
else if (fileEvent.Type == EventType.RENAMED)
else if (fileEvent.Type == sfw.net.EventType.RENAMED)
{
if (fileA.ExtensionWithDot != ".lock")
{
Expand All @@ -260,17 +240,14 @@ private int ProcessEvents(Event[] fileEvents)
.Union(new[] { fileA.FileNameWithoutExtension }).ToArray();

var branch = string.Join(@"/", branchPathElement);

Logger.Trace("RemoteBranchCreated: {0}/{1}", origin, branch);
RemoteBranchCreated?.Invoke(origin, branch);
eventsProcessed++;
AddOrUpdateEventData(events, EventType.RemoteBranchCreated, new EventData { Origin = origin, Branch = branch });
}
}
}
}
else if (fileA.IsChildOf(paths.BranchesPath))
{
if (fileEvent.Type == EventType.MODIFIED)
if (fileEvent.Type == sfw.net.EventType.MODIFIED)
{
if (fileA.DirectoryExists())
{
Expand All @@ -292,11 +269,10 @@ private int ProcessEvents(Event[] fileEvents)

var branch = string.Join(@"/", relativePathElements.ToArray());

Logger.Trace("LocalBranchChanged: {0}", branch);
LocalBranchChanged?.Invoke(branch);
eventsProcessed++;
AddOrUpdateEventData(events, EventType.LocalBranchChanged, new EventData { Branch = branch });

}
else if (fileEvent.Type == EventType.DELETED)
else if (fileEvent.Type == sfw.net.EventType.DELETED)
{
if (fileA.ExtensionWithDot == ".lock")
{
Expand All @@ -312,12 +288,9 @@ private int ProcessEvents(Event[] fileEvents)
}

var branch = string.Join(@"/", relativePathElements.ToArray());

Logger.Trace("LocalBranchDeleted: {0}", branch);
LocalBranchDeleted?.Invoke(branch);
eventsProcessed++;
AddOrUpdateEventData(events, EventType.LocalBranchDeleted, new EventData { Branch = branch });
}
else if (fileEvent.Type == EventType.RENAMED)
else if (fileEvent.Type == sfw.net.EventType.RENAMED)
{
if (fileA.ExtensionWithDot != ".lock")
{
Expand All @@ -337,30 +310,117 @@ private int ProcessEvents(Event[] fileEvents)
}

var branch = string.Join(@"/", relativePathElements.ToArray());

Logger.Trace("LocalBranchCreated: {0}", branch);
LocalBranchCreated?.Invoke(branch);
eventsProcessed++;
AddOrUpdateEventData(events, EventType.LocalBranchCreated, new EventData { Branch = branch });
}
}
}
}
}
else
{
if (repositoryChanged || ignoredPaths.Any(ignoredPath => fileA.IsChildOf(ignoredPath)))
if (events.ContainsKey(EventType.RepositoryChanged) || ignoredPaths.Any(ignoredPath => fileA.IsChildOf(ignoredPath)))
{
continue;
}
events.Add(EventType.RepositoryChanged, null);
}
}

return FireEvents(events);
}

private void AddOrUpdateEventData(Dictionary<EventType, List<EventData>> events, EventType type, EventData data)
{
if (!events.ContainsKey(type))
events.Add(type, new List<EventData>());
events[type].Add(data);
}

private int FireEvents(Dictionary<EventType, List<EventData>> events)
{
int eventsProcessed = 0;
if (events.ContainsKey(EventType.ConfigChanged))
{
Logger.Trace("ConfigChanged");
ConfigChanged?.Invoke();
eventsProcessed++;
}

repositoryChanged = true;
if (events.ContainsKey(EventType.HeadChanged))
{
Logger.Trace("HeadChanged");
HeadChanged?.Invoke();
eventsProcessed++;
}

Logger.Trace("RepositoryChanged");
RepositoryChanged?.Invoke();
if (events.ContainsKey(EventType.IndexChanged))
{
Logger.Trace("IndexChanged");
IndexChanged?.Invoke();
eventsProcessed++;
}

if (events.ContainsKey(EventType.RepositoryChanged))
{
Logger.Trace("RepositoryChanged");
RepositoryChanged?.Invoke();
eventsProcessed++;
}

List<EventData> localBranchesCreated;
if (events.TryGetValue(EventType.LocalBranchCreated, out localBranchesCreated))
{
foreach (var evt in localBranchesCreated)
{
Logger.Trace($"LocalBranchCreated: {evt.Branch}");
LocalBranchCreated?.Invoke(evt.Branch);
eventsProcessed++;
}
}

List<EventData> localBranchesChanged;
if (events.TryGetValue(EventType.LocalBranchChanged, out localBranchesChanged))
{
foreach (var evt in localBranchesChanged)
{
Logger.Trace($"LocalBranchChanged: {evt.Branch}");
LocalBranchChanged?.Invoke(evt.Branch);
eventsProcessed++;
}
}

List<EventData> localBranchesDeleted;
if (events.TryGetValue(EventType.LocalBranchDeleted, out localBranchesDeleted))
{
foreach (var evt in localBranchesDeleted)
{
Logger.Trace($"LocalBranchDeleted: {evt.Branch}");
LocalBranchDeleted?.Invoke(evt.Branch);
eventsProcessed++;
}
}

List<EventData> remoteBranchesCreated;
if (events.TryGetValue(EventType.RemoteBranchCreated, out remoteBranchesCreated))
{
foreach (var evt in remoteBranchesCreated)
{
Logger.Trace($"RemoteBranchCreated: {evt.Origin}/{evt.Branch}");
RemoteBranchCreated?.Invoke(evt.Origin, evt.Branch);
eventsProcessed++;
}
}

List<EventData> remoteBranchesDeleted;
if (events.TryGetValue(EventType.RemoteBranchDeleted, out remoteBranchesDeleted))
{
foreach (var evt in remoteBranchesDeleted)
{
Logger.Trace($"RemoteBranchDeleted: {evt.Origin}/{evt.Branch}");
RemoteBranchDeleted?.Invoke(evt.Origin, evt.Branch);
eventsProcessed++;
}
}
return eventsProcessed;
}

Expand Down Expand Up @@ -388,5 +448,25 @@ public void Dispose()
}

protected static ILogging Logger { get; } = Logging.GetLogger<RepositoryWatcher>();

private enum EventType
{
None,
ConfigChanged,
HeadChanged,
RepositoryChanged,
IndexChanged,
RemoteBranchDeleted,
RemoteBranchCreated,
LocalBranchDeleted,
LocalBranchCreated,
LocalBranchChanged
}

private class EventData
{
public string Origin;
public string Branch;
}
}
}