예제 #1
0
        private static void ProcessRepository(Repository repo, CleanupSettings settings)
        {
            var remote   = GetRemote(repo, settings);
            var branches = ScanBranches(repo);
            var orphans  = FindAllOrphanBranches(branches, settings);

            if (orphans.Count > 0)
            {
                if (settings.OutFileName != null)
                {
                    using (var file = File.CreateText(settings.OutFileName))
                    {
                        ListBranches(orphans, file);
                    }
                }

                if (settings.RunMode == RunMode.List)
                {
                    if (settings.OutFileName == null)
                    {
                        ListBranches(orphans, Console.Out);
                    }
                }
                else
                {
                    RemoveBranches(repo, remote, orphans, settings);
                }
            }

            Console.WriteLine("Done");
        }
예제 #2
0
        private static void Fetch(Repository repo, Remote remote, CleanupSettings settings)
        {
            Console.WriteLine($"Refreshing repo");
            var fetchOptions = new FetchOptions
            {
                CredentialsProvider =
                    CredentialsFactory.CreateHandler(settings.AuthType, settings.UserName, settings.Password),
                Prune = true
            };

            Commands.Fetch(repo, remote.Name, new string[0], fetchOptions, null);
        }
예제 #3
0
 public static void Run(CleanupSettings settings)
 {
     try
     {
         using (var repo = new Repository(settings.Path))
         {
             ProcessRepository(repo, settings);
         }
     }
     catch (Exception e) when(e.Message.Contains("too many redirects"))
     {
         Console.WriteLine($"Error: Authentication error");
     }
     catch (Exception e)
     {
         Console.WriteLine($"Error: {e.Message}");
     }
 }
예제 #4
0
        private static Remote GetRemote(Repository repo, CleanupSettings settings)
        {
            var remote = repo.Network.Remotes.FirstOrDefault();

            if (settings.RunMode == RunMode.Local)
            {
                Console.WriteLine($"Local mode. No fetch");
                return(null);
            }

            if (remote != null)
            {
                Console.WriteLine($"Remote: {remote.Name}");
                Fetch(repo, remote, settings);
            }
            else
            {
                throw new ApplicationException("no remote repository found");
            }
            return(remote);
        }
예제 #5
0
        private static List <BranchInfo> FindAllOrphanBranches(IEnumerable <BranchInfo> branches,
                                                               CleanupSettings settings)
        {
            var now = DateTime.Now;

            var daysMerged = settings.MaxDaysSinceMerged;
            var daysOrphan = settings.MaxDaysSinceOrphan;

            var filtered = branches.Where(x =>
                                          (now - x.LastUpdate).Days >= daysMerged && x.Merged ||
                                          (now - x.LastUpdate).Days > daysOrphan && !x.Merged);

            //var masks = settings.ExclusionMasks?.Select(x => new Regex(WildCardToRegular(x))).ToList();
            var masks = settings.ExclusionMasks?.Select(x => new Regex(x)).ToList();

            if (masks != null)
            {
                filtered = filtered.Where(x => masks.All(y => !y.IsMatch(x.RemoteName)));
            }
            return(filtered.Distinct().OrderBy(x => x.RemoteName).ToList());
        }
예제 #6
0
        private static void RemoveBranches(Repository repo, Remote remote, List <BranchInfo> orphans,
                                           CleanupSettings settings)
        {
            Console.WriteLine($"Found {orphans.Count()} orphan branches");
            Console.WriteLine("Cleaning up...");
            var pushOptions = new PushOptions
            {
                CredentialsProvider =
                    CredentialsFactory.CreateHandler(settings.AuthType, settings.UserName, settings.Password),
                OnPushStatusError = errors => Console.WriteLine($"{errors.Reference} - {errors.Message}.")
            };

            var chars = Console.WindowWidth - 20;

            foreach (var bi in orphans)
            {
                Console.Write($"Removing local: {bi.RemoteName.PadRightOrLimit(chars)}\r");
                repo.Branches.Remove(bi.LocalName);
            }
            Console.WriteLine($"Removing locals comleted".PadRightOrLimit(chars));

            if (settings.RunMode == RunMode.Full)
            {
                //now delete the branches on the remote
                var n = 0;
                chars = Console.WindowWidth - 30;
                foreach (var bis in orphans.Paged(settings.BatchSize))
                {
                    var remoteBranches = bis.Select(x => $":{x.RemoteName}").ToList();
                    repo.Network.Push(remote, pushRefSpecs: remoteBranches, pushOptions: pushOptions);
                    foreach (var bi in bis)
                    {
                        Console.Write($"Removing remote: {++n} {bi.RemoteName.PadRightOrLimit(chars)}\r");
                    }
                }
                Console.WriteLine($"Removing remotes completed".PadRightOrLimit(chars));
            }
        }