コード例 #1
0
        public async Task CanCreateType(GitIdType idType)
        {
            string p = TestContext.PerTestDirectory(idType.ToString());
            var    r = GitRepository.Init(p, new GitRepositoryInitArgs {
                IdType = idType
            });

            Assert.IsFalse(r.Commits.Any(), "No commits");
            Assert.IsFalse(r.Blobs.Any(), "No blobs");
            Assert.IsFalse(r.Remotes.Any(), "No remotes");

            var cw = GitCommitWriter.Create();

            cw.Author = cw.Committer = new GitSignature("A A", "A@A", new DateTime(2020, 2, 2, 0, 0, 0, DateTimeKind.Utc));

            var c = await cw.WriteAndFetchAsync(r);

            Assert.AreEqual(idType, c.Id.Type);

            using (var t = r.References.CreateUpdateTransaction())
            {
                t.UpdateHead(c.Id);
                await t.CommitAsync();
            }

            Assert.AreEqual("", await r.GetPlumbing().ConsistencyCheck(new() { Full = true }));
            Assert.AreEqual(idType, r.Head.Id !.Type);
            Assert.AreEqual(c.Id, r.Head.Id);
        }
コード例 #2
0
        public GitRepositoryObjectRepository(GitRepository repository, string objectsDir)
            : base(repository, "Repository:" + Path.GetDirectoryName(objectsDir))
        {
            if (!Directory.Exists(Path.Combine(objectsDir)))
            {
                throw new GitRepositoryException($"{objectsDir} does not exist");
            }

            ObjectsDir = objectsDir;
            _idType    = GitIdType.Sha1;

            _repositories = new(() => GetRepositories().ToArray());
        }
コード例 #3
0
ファイル: GitReadExtensions.cs プロジェクト: AmpScm/AmpScm
        public static async ValueTask <GitId> ReadGitIdAsync(this Bucket bucket, GitIdType type)
        {
            if (bucket is null)
            {
                throw new ArgumentNullException(nameof(bucket));
            }

            int hl = type.HashLength();
            var bb = await bucket.ReadFullAsync(hl).ConfigureAwait(false);

            if (bb.Length == hl)
            {
                return(new GitId(type, bb.ToArray()));
            }
            else
            {
                throw new BucketEofException(bucket);
            }
        }
コード例 #4
0
        private IEnumerable <GitObjectRepository> GetRepositories()
        {
            int format = Repository.Configuration.GetInt("core", "repositoryformatversion") ?? -1;

            if (format == 1)
            {
                foreach (var(key, value) in Repository.Configuration.GetGroup("extensions", null))
                {
                    switch (key)
                    {
                    case "noop":
                        break;

                    case "partialclone":
                        PromisorRemote = value;
                        break;

                    case "objectformat":
                        if (string.Equals(value, "sha1", StringComparison.OrdinalIgnoreCase))
                        {
                            /* Do nothing */
                        }
                        else if (string.Equals(value, "sha256", StringComparison.OrdinalIgnoreCase))
                        {
                            Repository.SetSHA256();     // Ugly experimental hack for now
                            _idType = GitIdType.Sha256;
                        }
                        else
                        {
                            throw new GitException($"Found unsupported objectFormat {value} in repository {Repository.FullPath}");
                        }
                        break;

                    case "worktreeconfig":
                        break;

                    default:
                        throw new GitException($"Found unsupported extension {key} in repository {Repository.FullPath}");
                    }
                }
            }
            else if (format != 0)
            {
                throw new GitException($"Found unsupported repository format {format} for {Repository.FullPath}");
            }

            // Check for commit chain first, to allow cheap access to commit type
            string chain = Path.Combine(ObjectsDir, "info", "commit-graph");

            if (File.Exists(chain) && Repository.Configuration.Lazy.CommitGraph)
            {
                yield return(new GitCommitGraph(Repository, chain));
            }
            else if (Directory.Exists(chain += "s") && File.Exists(Path.Combine(chain, "commit-graph-chain")) && Repository.Configuration.Lazy.CommitGraph)
            {
                yield return(new CommitGraphChain(Repository, chain));
            }

            string multipackFile = Path.Combine(ObjectsDir, "pack", "multi-pack-index");
            MultiPackObjectRepository?multiPack = null;

            if (File.Exists(multipackFile) && Repository.Configuration.Lazy.MultiPack)
            {
                MultiPackObjectRepository mp = new MultiPackObjectRepository(Repository, multipackFile);

                if (mp.CanLoad())
                {
                    yield return(mp);

                    multiPack = mp;
                }
                else
                {
                    mp.Dispose();
                }
            }

            foreach (var pack in Directory.EnumerateFiles(Path.Combine(ObjectsDir, "pack"), "pack-*.pack"))
            {
                // TODO: Check if length matches hashtype?
                if (!multiPack?.ContainsPack(pack) ?? true)
                {
                    yield return(new PackObjectRepository(Repository, pack, _idType));
                }
            }

            yield return(new FileObjectRepository(Repository, ObjectsDir));

            var alternatesFile = Path.Combine(ObjectsDir, "info/alternates");

            if (File.Exists(alternatesFile))
            {
                foreach (var line in File.ReadAllLines(alternatesFile))
                {
                    var l = line.Trim();
                    if (string.IsNullOrWhiteSpace(l))
                    {
                        continue;
                    }
                    else if (l[0] == '#' || l[0] == ';')
                    {
                        continue;
                    }

                    string?dir = null;

                    var p = Path.Combine(ObjectsDir, l);

                    if (Directory.Exists(p))
                    {
                        dir = p;
                    }

                    if (dir != null)
                    {
                        yield return(new GitRepositoryObjectRepository(Repository, dir));
                    }
                }
            }
        }
コード例 #5
0
ファイル: GitRepository.Config.cs プロジェクト: AmpScm/AmpScm
 internal GitInternalConfigAccess(GitIdType type)
 {
     IdType = type;
 }
コード例 #6
0
ファイル: GitPackFrameBucket.cs プロジェクト: AmpScm/AmpScm
 public GitPackFrameBucket(Bucket inner, GitIdType idType, Func <GitId, ValueTask <GitObjectBucket?> >?fetchBucketById = null)
     : base(inner.WithPosition())
 {
     _idType          = idType;
     _fetchBucketById = fetchBucketById;
 }
コード例 #7
0
ファイル: PackObjectRepository.cs プロジェクト: AmpScm/AmpScm
 public PackObjectRepository(GitRepository repository, string packFile, GitIdType idType)
     : base(repository, "Pack:" + packFile)
 {
     PackFile = packFile ?? throw new ArgumentNullException(nameof(packFile));
     _idType  = idType;
 }
コード例 #8
0
 /// <summary>
 /// Return length of this hash in bytes
 /// </summary>
 /// <param name="type"></param>
 /// <returns></returns>
 /// <exception cref="ArgumentOutOfRangeException"></exception>
 public static int HashLength(this GitIdType type)
 {
     return(GitId.HashLength(type));
 }