示例#1
0
 /**
  * Create the <code>pack-*.keep</code> file, with the given message.
  *
  * @param msg
  *            message to store in the file.
  * @return true if the keep file was successfully written; false otherwise.
  * @throws IOException
  *             the keep file could not be written.
  */
 public bool Lock(string msg)
 {
     if (msg == null) return false;
     if (!msg.EndsWith("\n")) msg += "\n";
     LockFile lf = new LockFile(keepFile);
     if (!lf.Lock()) return false;
     lf.Write(Constants.encode(msg));
     return lf.Commit();
 }
示例#2
0
 public LockFileOutputStream(LockFile lockfile)
 {
     m_lock_file = lockfile;
 }
示例#3
0
        private static void LockAndWriteFile(FileInfo file, byte[] content)
        {
            string name = file.Name;
            var lck = new LockFile(file);
            if (!lck.Lock())
            {
                throw new ObjectWritingException("Unable to lock " + name);
            }

            try
            {
                lck.Write(content);
            }
            catch (IOException ioe)
            {
                throw new ObjectWritingException("Unable to write " + name, ioe);
            }
            if (!lck.Commit())
            {
                throw new ObjectWritingException("Unable to write " + name);
            }
        }
示例#4
0
            public override RefUpdateResult Store(LockFile @lock, RefUpdateResult status)
            {
                GitSharp.Ref.Storage storage = ref_update._ref.StorageFormat;
                if (storage == GitSharp.Ref.Storage.New)
                    return status;
                if (storage.IsPacked)
                    ref_update.db.removePackedRef(ref_update._ref.Name);

                int levels = Count(ref_update._ref.Name, '/') - 2;

                // Delete logs _before_ unlocking
                DirectoryInfo gitDir = ref_update.db.Repository.Directory;
                DirectoryInfo logDir = new DirectoryInfo(gitDir+"/"+ Constants.LOGS);
                deleteFileAndEmptyDir(new FileInfo(logDir + "/" + ref_update._ref.Name), levels);

                // We have to unlock before (maybe) deleting the parent directories
                @lock.Unlock();
                if (storage.IsLoose)
                    deleteFileAndEmptyDir(ref_update.looseFile, levels);
                return status;
            }
示例#5
0
 public override RefUpdateResult Store(LockFile lockFile, RefUpdateResult status)
 {
     return ref_update.updateStore(lockFile, status);
 }
示例#6
0
 public abstract RefUpdateResult Store(LockFile lockFile, RefUpdateResult status);
示例#7
0
 private RefUpdateResult updateStore(LockFile @lock, RefUpdateResult status)
 {
     if (status == RefUpdateResult.NoChange)
         return status;
     @lock.NeedStatInformation=(true);
     @lock.Write(newValue);
     string msg = GetRefLogMessage();
     if (msg != null && refLogIncludeResult)
     {
         if (status == RefUpdateResult.Forced)
             msg += ": forced-update";
         else if (status == RefUpdateResult.FastForward)
             msg += ": fast forward";
         else if (status == RefUpdateResult.New)
             msg += ": created";
     }
     RefLogWriter.append(this, msg);
     if ([email protected]())
         return RefUpdateResult.LockFailure;
     db.stored(this._ref.OriginalName, _ref.Name, newValue, @lock.CommitLastModified);
     return status;
 }
示例#8
0
        private RefUpdateResult updateImpl(RevWalk.RevWalk walk, StoreBase store)
        {
            LockFile @lock;
            RevObject newObj;
            RevObject oldObj;

            @lock = new LockFile(looseFile);
            if ([email protected]())
                return RefUpdateResult.LockFailure;
            try
            {
                OldObjectId = db.IdOf(Name);
                if (expValue != null)
                {
                    ObjectId o;
                    o = OldObjectId != null ? OldObjectId : ObjectId.ZeroId;
                    if (!expValue.Equals(o))
                        return RefUpdateResult.LockFailure;
                }
                if (OldObjectId == null)
                    return store.Store(@lock, RefUpdateResult.New);

                newObj = safeParse(walk, newValue);
                oldObj = safeParse(walk, OldObjectId);
                if (newObj == oldObj)
                    return store.Store(@lock, RefUpdateResult.NoChange);

                if (newObj is RevCommit && oldObj is RevCommit)
                {
                    if (walk.isMergedInto((RevCommit)oldObj, (RevCommit)newObj))
                        return store.Store(@lock, RefUpdateResult.FastForward);
                }

                if (IsForceUpdate)
                    return store.Store(@lock, RefUpdateResult.Forced);
                return RefUpdateResult.Rejected;
            }
            finally
            {
                @lock.Unlock();
            }
        }
示例#9
0
 public void save()
 {
     byte[] o = Constants.encode(toText());
     LockFile lf = new LockFile(getFile());
     if (!lf.Lock())
         throw new IOException("Cannot lock " + getFile());
     try
     {
         lf.Write(o);
         if (!lf.Commit())
             throw new IOException("Cannot commit write to " + getFile());
     }
     finally
     {
         lf.Unlock();
     }
 }
示例#10
0
 public override RefUpdateResult Store(LockFile lockFile, RefUpdateResult status)
 {
     return RefUpdate.UpdateRepositoryStore(lockFile, status);
 }
示例#11
0
            public override RefUpdateResult Store(LockFile @lock, RefUpdateResult status)
            {
                var storage = RefUpdate._ref.StorageFormat;
                if (storage == Ref.Storage.New)
                {
                    return status;
                }

                if (storage.IsPacked)
                {
                    RefUpdate._db.RemovePackedRef(RefUpdate._ref.Name);
                }

                int levels = Count(RefUpdate._ref.Name, '/') - 2;

                // Delete logs _before_ unlocking
                DirectoryInfo gitDir = RefUpdate._db.Repository.Directory;
                var logDir = new DirectoryInfo(gitDir + "/" + Constants.LOGS);
                DeleteFileAndEmptyDir(new FileInfo(logDir + "/" + RefUpdate._ref.Name), levels);

                // We have to unlock before (maybe) deleting the parent directories
                @lock.Unlock();
                if (storage.IsLoose)
                {
                    DeleteFileAndEmptyDir(RefUpdate._looseFile, levels);
                }
                return status;
            }
示例#12
0
        private RefUpdateResult UpdateRepositoryStore(LockFile @lock, RefUpdateResult status)
        {
            if (status == RefUpdateResult.NoChange) return status;

            @lock.NeedStatInformation = true;
            @lock.Write(_newValue);

            string msg = GetRefLogMessage();

            if (!string.IsNullOrEmpty(msg))
            {
                if (_refLogIncludeResult)
                {
                    String strResult = ToResultString(status);
                    if (strResult != null)
                    {
                        msg = !string.IsNullOrEmpty(msg) ? msg + ": " + strResult : strResult;
                    }
                }
                RefLogWriter.append(this, msg);
            }

            if ([email protected]())
            {
                return RefUpdateResult.LockFailure;
            }

            _db.Stored(_ref.OriginalName, _ref.Name, _newValue, @lock.CommitLastModified);
            return status;
        }
示例#13
0
        private RefUpdateResult UpdateImpl(RevWalk.RevWalk walk, StoreBase store)
        {
            int lastSlash = Name.LastIndexOf('/');
            if (lastSlash > 0)
            {
                if (Repository.getAllRefs().ContainsKey(Name.Slice(0, lastSlash)))
                {
                    return RefUpdateResult.LockFailure;
                }
            }

            string rName = Name + "/";
            foreach (Ref r in Repository.getAllRefs().Values)
            {
                if (r.Name.StartsWith(rName))
                {
                    return RefUpdateResult.LockFailure;
                }
            }

            var @lock = new LockFile(_looseFile);
            if ([email protected]())
            {
                return RefUpdateResult.LockFailure;
            }

            try
            {
                OldObjectId = _db.IdOf(Name);
                if (_expValue != null)
                {
                    ObjectId o = OldObjectId ?? ObjectId.ZeroId;
                    if (!_expValue.Equals(o))
                    {
                        return RefUpdateResult.LockFailure;
                    }
                }

                if (OldObjectId == null)
                {
                    return store.Store(@lock, RefUpdateResult.New);
                }

                RevObject newObj = SafeParse(walk, _newValue);
                RevObject oldObj = SafeParse(walk, OldObjectId);
                if (newObj == oldObj)
                {
                    return store.Store(@lock, RefUpdateResult.NoChange);
                }

                if (newObj is RevCommit && oldObj is RevCommit)
                {
                    if (walk.isMergedInto((RevCommit)oldObj, (RevCommit)newObj))
                    {
                        return store.Store(@lock, RefUpdateResult.FastForward);
                    }
                }

                if (IsForceUpdate)
                {
                    return store.Store(@lock, RefUpdateResult.Forced);
                }

                return RefUpdateResult.Rejected;
            }
            finally
            {
                @lock.Unlock();
            }
        }
示例#14
0
        private RefUpdateResult UpdateImpl(RevWalk.RevWalk walk, StoreBase store)
        {
            if (IsNameConflicting())
            {
                return RefUpdateResult.LockFailure;
            }

            var @lock = new LockFile(_looseFile);
            if ([email protected]())
            {
                return RefUpdateResult.LockFailure;
            }

            try
            {
                OldObjectId = _db.IdOf(Name);
                if (_expValue != null)
                {
                    ObjectId o = OldObjectId ?? ObjectId.ZeroId;
                    if (!AnyObjectId.equals(_expValue, o))
                    {
                        return RefUpdateResult.LockFailure;
                    }
                }

                if (OldObjectId == null)
                {
                    return store.Store(@lock, RefUpdateResult.New);
                }

                RevObject newObj = SafeParse(walk, _newValue);
                RevObject oldObj = SafeParse(walk, OldObjectId);
                if (newObj == oldObj)
                {
                    return store.Store(@lock, RefUpdateResult.NoChange);
                }

                if (newObj is RevCommit && oldObj is RevCommit)
                {
                    if (walk.isMergedInto((RevCommit)oldObj, (RevCommit)newObj))
                    {
                        return store.Store(@lock, RefUpdateResult.FastForward);
                    }
                }

                if (IsForceUpdate)
                {
                    return store.Store(@lock, RefUpdateResult.Forced);
                }

                return RefUpdateResult.Rejected;
            }
            finally
            {
                @lock.Unlock();
            }
        }