コード例 #1
0
ファイル: RefRename.cs プロジェクト: drothmaler/GitSharp
 public RefRename(RefUpdate toUpdate, RefUpdate fromUpdate)
 {
     _renameResult = RefResult.NotAttempted;
     _newToUpdate = toUpdate;
     _oldFromDelete = fromUpdate;
 }
コード例 #2
0
ファイル: RefRename.cs プロジェクト: drothmaler/GitSharp
        /// <summary>
        /// The result of the new ref update
        /// </summary>
        /// <returns></returns>
        /// <exception cref="IOException"></exception>
        public RefResult Rename()
        {
            Ref oldRef = _oldFromDelete.Repository.getRef(Constants.HEAD);
            bool renameHeadToo = oldRef != null && oldRef.Name == _oldFromDelete.Name;
            Repository db = _oldFromDelete.Repository;
            RefLogWriter.renameTo(db, _oldFromDelete, _newToUpdate);
            _newToUpdate.SetRefLogMessage(null, false);
            string tmpRefName = "RENAMED-REF.." + Thread.CurrentThread.ManagedThreadId;

            RefUpdate tmpUpdateRef = db.UpdateRef(tmpRefName);
            if (renameHeadToo)
            {
                try
                {
                    _oldFromDelete.Repository.Link(Constants.HEAD, tmpRefName);
                }
                catch (IOException)
                {
                    RefLogWriter.renameTo(db, _newToUpdate, _oldFromDelete);
                    return _renameResult = RefResult.LockFailure;
                }
            }

            tmpUpdateRef.NewObjectId = _oldFromDelete.OldObjectId;
            tmpUpdateRef.IsForceUpdate = true;
            RefResult update = tmpUpdateRef.Update();
            if (update != RefResult.Forced && update != RefResult.New && update != RefResult.NoChange)
            {
                RefLogWriter.renameTo(db, _newToUpdate, _oldFromDelete);
                if (renameHeadToo)
                {
                    _oldFromDelete.Repository.Link(Constants.HEAD, _oldFromDelete.Name);
                }

                return _renameResult = update;
            }

            _oldFromDelete.ExpectedOldObjectId = _oldFromDelete.OldObjectId;
            _oldFromDelete.IsForceUpdate = true;
            RefResult delete = _oldFromDelete.Delete();
            if (delete != RefResult.Forced)
            {
                if (db.getRef(_oldFromDelete.Name) != null)
                {
                    RefLogWriter.renameTo(db, _newToUpdate, _oldFromDelete);
                    if (renameHeadToo)
                    {
                        _oldFromDelete.Repository.Link(Constants.HEAD, _oldFromDelete.Name);
                    }
                }
                return _renameResult = delete;
            }

            _newToUpdate.NewObjectId = tmpUpdateRef.NewObjectId;
            RefResult updateResult = _newToUpdate.Update();
            if (updateResult != RefResult.New)
            {
                RefLogWriter.renameTo(db, _newToUpdate, _oldFromDelete);
                if (renameHeadToo)
                {
                    _oldFromDelete.Repository.Link(Constants.HEAD, _oldFromDelete.Name);
                }
                _oldFromDelete.ExpectedOldObjectId = null;
                _oldFromDelete.NewObjectId = _oldFromDelete.OldObjectId;
                _oldFromDelete.IsForceUpdate = true;
                _oldFromDelete.SetRefLogMessage(null, false);
                RefResult undelete = _oldFromDelete.Update();
                if (undelete != RefResult.New && undelete != RefResult.LockFailure)
                {
                    return _renameResult = RefResult.IOFailure;
                }
                return _renameResult = RefResult.LockFailure;
            }

            if (renameHeadToo)
            {
                _oldFromDelete.Repository.Link(Constants.HEAD, _newToUpdate.Name);
            }
            else
            {
                db.OnRefsChanged();
            }

            RefLogWriter.append(this, _newToUpdate.Name, "Branch: renamed "
                + Repository.ShortenRefName(_oldFromDelete.Name) + " to "
                + Repository.ShortenRefName(_newToUpdate.Name));

            if (renameHeadToo)
            {
                RefLogWriter.append(this, Constants.HEAD, "Branch: renamed "
                    + Repository.ShortenRefName(_oldFromDelete.Name) + " to "
                    + Repository.ShortenRefName(_newToUpdate.Name));
            }

            return _renameResult = RefResult.Renamed;
        }