private void RewriteReference(DirectReference oldRef, ObjectId newTarget, string backupNamePrefix, Queue <Action> rollbackActions) { string newRefName = oldRef.CanonicalName; if (oldRef.IsTag() && tagNameRewriter != null) { newRefName = Reference.TagPrefix + tagNameRewriter(oldRef.CanonicalName.Substring(Reference.TagPrefix.Length), false, oldRef.Target); } if (oldRef.Target.Id == newTarget && oldRef.CanonicalName == newRefName) { // The reference isn't rewritten return; } string backupName = backupNamePrefix + oldRef.CanonicalName.Substring("refs/".Length); if (repo.Refs.Resolve <Reference>(backupName) != null) { throw new InvalidOperationException( String.Format("Can't back up reference '{0}' - '{1}' already exists", oldRef.CanonicalName, backupName)); } repo.Refs.Add(backupName, oldRef.TargetIdentifier, false, "filter-branch: backup"); rollbackActions.Enqueue(() => repo.Refs.Remove(backupName)); Reference newRef = repo.Refs.UpdateTarget(oldRef, newTarget, "filter-branch: rewrite"); rollbackActions.Enqueue(() => repo.Refs.UpdateTarget(oldRef, oldRef.Target.Id, "filter-branch: abort")); if (newRef.CanonicalName == newRefName) { return; } repo.Refs.Move(newRef, newRefName); rollbackActions.Enqueue(() => repo.Refs.Move(newRef, oldRef.CanonicalName)); }
private void RewriteReference(DirectReference oldRef, ObjectId newTarget, string backupNamePrefix, Queue<Action> rollbackActions) { string newRefName = oldRef.CanonicalName; if (oldRef.IsTag() && tagNameRewriter != null) { newRefName = Reference.TagPrefix + tagNameRewriter(oldRef.CanonicalName.Substring(Reference.TagPrefix.Length), false, oldRef.Target); } if (oldRef.Target.Id == newTarget && oldRef.CanonicalName == newRefName) { // The reference isn't rewritten return; } string backupName = backupNamePrefix + oldRef.CanonicalName.Substring("refs/".Length); if (repo.Refs.Resolve<Reference>(backupName) != null) { throw new InvalidOperationException( String.Format("Can't back up reference '{0}' - '{1}' already exists", oldRef.CanonicalName, backupName)); } repo.Refs.Add(backupName, oldRef.TargetIdentifier, false, "filter-branch: backup"); rollbackActions.Enqueue(() => repo.Refs.Remove(backupName)); Reference newRef = repo.Refs.UpdateTarget(oldRef, newTarget, "filter-branch: rewrite"); rollbackActions.Enqueue(() => repo.Refs.UpdateTarget(oldRef, oldRef.Target.Id, "filter-branch: abort")); if (newRef.CanonicalName == newRefName) { return; } repo.Refs.Move(newRef, newRefName); rollbackActions.Enqueue(() => repo.Refs.Move(newRef, oldRef.CanonicalName)); }