private void doCheckout(GitSharp.Core.Ref branch) { if (branch == null) { throw new ArgumentNullException("branch", "Cannot checkout; no HEAD advertised by remote"); } var repo = Repository._internal_repo; if (!Constants.HEAD.Equals(branch.getName())) { RefUpdate u1 = repo.UpdateRef(Constants.HEAD); u1.disableRefLog(); u1.link(branch.getName()); } GitSharp.Core.Commit commit = repo.MapCommit(branch.ObjectId); RefUpdate u = repo.UpdateRef(Constants.HEAD); u.NewObjectId = commit.CommitId; u.forceUpdate(); GitIndex index = new GitIndex(repo); GitSharp.Core.Tree tree = commit.TreeEntry; WorkDirCheckout co = new WorkDirCheckout(repo, repo.WorkingDirectory, index, tree); co.checkout(); index.write(); }
public void test028_LockPackedRef() { writeTrashFile(".git/packed-refs", "7f822839a2fe9760f386cbbbcb3f92c5fe81def7 refs/heads/foobar"); writeTrashFile(".git/HEAD", "ref: refs/heads/foobar\n"); BUG_WorkAroundRacyGitIssues("packed-refs"); BUG_WorkAroundRacyGitIssues("HEAD"); ObjectId resolve = db.Resolve("HEAD"); Assert.AreEqual("7f822839a2fe9760f386cbbbcb3f92c5fe81def7", resolve.Name); RefUpdate lockRef = db.UpdateRef("HEAD"); ObjectId newId = ObjectId.FromString("07f822839a2fe9760f386cbbbcb3f92c5fe81def"); lockRef.NewObjectId = newId; Assert.AreEqual(RefUpdate.RefUpdateResult.FORCED, lockRef.forceUpdate()); Assert.IsTrue(new FileInfo(db.Directory.FullName + "/refs/heads/foobar").Exists); Assert.AreEqual(newId, db.Resolve("refs/heads/foobar")); // Again. The ref already exists RefUpdate lockRef2 = db.UpdateRef("HEAD"); ObjectId newId2 = ObjectId.FromString("7f822839a2fe9760f386cbbbcb3f92c5fe81def7"); lockRef2.NewObjectId = newId2; Assert.AreEqual(RefUpdate.RefUpdateResult.FORCED, lockRef2.forceUpdate()); Assert.IsTrue(new FileInfo(db.Directory.FullName + "/refs/heads/foobar").Exists); Assert.AreEqual(newId2, db.Resolve("refs/heads/foobar")); }
/* * Update a reference to point to an object. * * @param <T> * type of the target object. * @param ref * the name of the reference to update to. If {@code ref} does * not start with {@code refs/} and is not the magic names * {@code HEAD} {@code FETCH_HEAD} or {@code MERGE_HEAD}, then * {@code refs/heads/} will be prefixed in front of the given * name, thereby assuming it is a branch. * @param obj * the target object. * @return the target object. * @throws Exception */ public T update <T>(String @ref, T obj) where T : ObjectId { if (Constants.HEAD.Equals(@ref)) { } else if ("FETCH_HEAD".Equals(@ref)) { } else if ("MERGE_HEAD".Equals(@ref)) { } else if (@ref.StartsWith(Constants.R_REFS)) { } else { @ref = Constants.R_HEADS + @ref; } RefUpdate u = db.UpdateRef(@ref); u.NewObjectId = (obj); switch (u.forceUpdate()) { case RefUpdate.RefUpdateResult.FAST_FORWARD: case RefUpdate.RefUpdateResult.FORCED: case RefUpdate.RefUpdateResult.NEW: case RefUpdate.RefUpdateResult.NO_CHANGE: updateServerInfo(); return(obj); default: throw new IOException("Cannot write " + @ref + " " + u.Result); } }
public void testTwoSuccessiveCommitsLinkedToHead() { var repo = createBareRepository(); var workingDirectory = repo.WorkingDirectory; repo.Create(); var objectWriter = new ObjectWriter(repo); FileInfo project1_a_txt = writeTrashFile(Path.Combine(workingDirectory.FullName, "Project-1/A.txt"), "A.txt - first version\n"); FileInfo project1_b_txt = writeTrashFile(Path.Combine(workingDirectory.FullName, "Project-1/B.txt"), "B.txt - first version\n"); var tree = new global::GitSharp.Core.Tree(repo); global::GitSharp.Core.Tree projectTree = tree.AddTree("Project-1"); addFile(projectTree, project1_a_txt, objectWriter); projectTree.Id = (objectWriter.WriteTree(projectTree)); addFile(projectTree, project1_b_txt, objectWriter); projectTree.Id = (objectWriter.WriteTree(projectTree)); tree.Id = (objectWriter.WriteTree(tree)); var commit = new global::GitSharp.Core.Commit(repo) { Author = new PersonIdent(author, (0L), 60), Committer = new PersonIdent(committer, (0L), 60), Message = "Foo\n\nMessage", TreeEntry = tree }; commit.Save(); var commitId = commit.CommitId; FileInfo project1_b_v2_txt = writeTrashFile(Path.Combine(workingDirectory.FullName, "Project-1/B.txt"), "B.txt - second version\n"); tree = new global::GitSharp.Core.Tree(repo); projectTree = tree.AddTree("Project-1"); addFile(projectTree, project1_a_txt, objectWriter); projectTree.Id = (objectWriter.WriteTree(projectTree)); addFile(projectTree, project1_b_v2_txt, objectWriter); projectTree.Id = (objectWriter.WriteTree(projectTree)); tree.Id = (objectWriter.WriteTree(tree)); commit = new global::GitSharp.Core.Commit(repo) { Author = new PersonIdent(author, (0L), 60), Committer = new PersonIdent(committer, (0L), 60), Message = "Modified", ParentIds = new[] { commitId }, TreeEntry = tree }; commit.Save(); commitId = commit.CommitId; RefUpdate lck = repo.UpdateRef("refs/heads/master"); Assert.IsNotNull(lck, "obtained lock"); lck.NewObjectId = commitId; Assert.AreEqual(RefUpdate.RefUpdateResult.NEW, lck.forceUpdate()); }
private void commit(Core.Tree t, string commitMsg, PersonIdent author, PersonIdent committer) { Core.Commit commit = new Core.Commit(db); commit.Author = (author); commit.Committer = (committer); commit.Message = (commitMsg); commit.TreeEntry = (t); //ObjectWriter writer = new ObjectWriter(db); //commit.CommitId = (writer.WriteCommit(commit)); commit.Save(); int nl = commitMsg.IndexOf('\n'); RefUpdate ru = db.UpdateRef(Constants.HEAD); ru.NewObjectId = (commit.CommitId); ru.setRefLogMessage("commit : " + ((nl == -1) ? commitMsg : commitMsg.Slice(0, nl)), false); ru.forceUpdate(); }