Ejemplo n.º 1
0
        public virtual void ApplyFileChanges(RepositoryChangeRecord changeRecord, IRepositoryPublisher source)
        {
            ApplyFileChanges(changeRecord);

            foreach (var removeFile in changeRecord.Remove)
            {
                RemoveArtifact(removeFile);
            }
            foreach (var addFile in changeRecord.Add)
            {
                using (var inputStream = source.ReadArtifactStream(addFile))
                {
                    WriteArtifactStream(addFile, inputStream, createNew: false);
                }
            }
        }
Ejemplo n.º 2
0
        public bool Execute()
        {
            Reports        = Options.Reports;
            LocalPackages  = Options.SourcePackages ?? Directory.GetCurrentDirectory();
            RemotePackages = Options.RemotePackages;

            Options.Reports.Information.WriteLine(
                "Pushing artifacts");
            Options.Reports.Information.WriteLine(
                "  from {0}",
                LocalPackages.Bold());
            Options.Reports.Information.WriteLine(
                "  to {0}",
                RemotePackages.Bold());

            var sw = new Stopwatch();

            sw.Start();

            IRepositoryPublisher local = new FileSystemRepositoryPublisher(
                LocalPackages);

            IRepositoryPublisher remote = RepositoryPublishers.Create(
                RemotePackages,
                Reports);

            // Recall what index to start pushing to remote
            var transmitRecord = FillOut(local.GetRepositoryTransmitRecord());

            int nextIndex;

            if (!transmitRecord.Push.TryGetValue(RemotePackages, out nextIndex))
            {
                nextIndex = 1;
            }

            // Read change index from that point forward
            var changeRecord = FillOut(local.MergeRepositoryChangeRecordsStartingWithIndex(nextIndex));

            if (!changeRecord.Add.Any() &&
                !changeRecord.Remove.Any())
            {
                Reports.Information.WriteLine("There are no changes to push");
            }
            else
            {
                Reports.Information.WriteLine(
                    "Pushing {0} added and {1} removed artifacts",
                    changeRecord.Add.Count().ToString().Bold(),
                    changeRecord.Remove.Count().ToString().Bold());

                // We now know where to start from next time
                transmitRecord.Push[RemotePackages] = changeRecord.Next;

                // Determine the latest remote change number
                var remoteZeroRecord = FillOut(remote.GetRepositoryChangeRecord(0));
                var remoteIndexNext  = remoteZeroRecord.Next;

                // Point remote records to point to the following remote change number
                changeRecord.Next     = remoteIndexNext + 1;
                remoteZeroRecord.Next = remoteIndexNext + 1;

                // Apply the file changes to remote
                remote.ApplyFileChanges(changeRecord, local);

                // Correct /{id}/{version}/$index.json files based on file changes

                // Commit new change record to remote
                remote.StoreRepositoryChangeRecord(0, remoteZeroRecord);
                remote.StoreRepositoryChangeRecord(remoteIndexNext, changeRecord);

                // Locally commit where to push remotely next
                local.StoreRepositoryTransmitRecord(transmitRecord);
            }

            Reports.Information.WriteLine(
                "{0}, {1}ms elapsed",
                "Push complete".Green().Bold(),
                sw.ElapsedMilliseconds);

            return(true);
        }
Ejemplo n.º 3
0
        public static RepositoryChangeRecord MergeRepositoryChangeRecordsStartingWithIndex(this IRepositoryPublisher feed, int index)
        {
            RepositoryChangeRecord resultRecord = null;
            var scanIndex = index;

            for (; ;)
            {
                var scanRecord = feed.GetRepositoryChangeRecord(scanIndex);

                if (scanRecord == null)
                {
                    return(resultRecord);
                }

                if (resultRecord == null)
                {
                    resultRecord = scanRecord;
                }
                else
                {
                    resultRecord = Merge(resultRecord, scanRecord);
                }
                scanIndex = resultRecord.Next;
            }
        }