public void CreateObjectWhenProjectRootIsChildOfGitRootAndFileInGitRoot()
        {
            var repositoryPath   = "/Source".ToSPath();
            var unityProjectPath = repositoryPath.Combine("UnityProject");

            SubstituteFactory.CreateProcessEnvironment(repositoryPath);
            var environment = SubstituteFactory.CreateEnvironment(new CreateEnvironmentOptions {
                RepositoryPath   = repositoryPath,
                UnityProjectPath = unityProjectPath
            });

            SPath.FileSystem = SubstituteFactory.CreateFileSystem(new CreateFileSystemOptions {
                CurrentDirectory = repositoryPath
            });

            const string        inputPath   = "Something.sln";
            const GitFileStatus inputStatus = GitFileStatus.Added;

            var expectedFullPath    = repositoryPath.Combine(inputPath);
            var expectedProjectPath = expectedFullPath.RelativeTo(unityProjectPath);

            var expected = new GitStatusEntry(inputPath, expectedFullPath, expectedProjectPath, GitFileStatus.None, inputStatus);

            var gitStatusEntryFactory = new GitObjectFactory(environment);

            var result = gitStatusEntryFactory.CreateGitStatusEntry(inputPath, GitFileStatus.None, inputStatus);

            result.Should().Be(expected);
        }
예제 #2
0
        private static void OnProjectWindowItemGUI(string guid, Rect itemRect)
        {
            if (!EnsureInitialized())
            {
                return;
            }

            if (Event.current.type != EventType.Repaint || string.IsNullOrEmpty(guid))
            {
                return;
            }

            var index     = guids.IndexOf(guid);
            var indexLock = guidsLocks.IndexOf(guid);

            if (index < 0 && indexLock < 0)
            {
                return;
            }

            GitStatusEntry?gitStatusEntry = null;
            GitFileStatus  status         = GitFileStatus.None;

            if (index >= 0)
            {
                gitStatusEntry = entries[index];
                status         = gitStatusEntry.Value.Status;
            }

            var isLocked = indexLock >= 0;
            var texture  = Styles.GetFileStatusIcon(status, isLocked);

            if (texture == null)
            {
                var path = gitStatusEntry.HasValue ? gitStatusEntry.Value.Path : string.Empty;
                Logger.Warning("Unable to retrieve texture for Guid:{0} EntryPath:{1} Status: {2} IsLocked:{3}", guid, path, status.ToString(), isLocked);
                return;
            }

            Rect rect;

            // End of row placement
            if (itemRect.width > itemRect.height)
            {
                rect = new Rect(itemRect.xMax - texture.width, itemRect.y, texture.width,
                                Mathf.Min(texture.height, EditorGUIUtility.singleLineHeight));
            }
            // Corner placement
            // TODO: Magic numbers that need reviewing. Make sure this works properly with long filenames and wordwrap.
            else
            {
                var scale = itemRect.height / 90f;
                var size  = new Vector2(texture.width * scale, texture.height * scale);
                size = size / EditorGUIUtility.pixelsPerPoint;
                var offset = new Vector2(itemRect.width * Mathf.Min(.4f * scale, .2f), itemRect.height * Mathf.Min(.2f * scale, .2f));
                rect = new Rect(itemRect.center.x - size.x * .5f + offset.x, itemRect.center.y - size.y * .5f + offset.y, size.x, size.y);
            }

            GUI.DrawTexture(rect, texture, ScaleMode.ScaleToFit);
        }
예제 #3
0
        private static bool IsObjectUnlocked(Object selected)
        {
            if (selected == null)
            {
                return(false);
            }

            NPath assetPath      = AssetDatabase.GetAssetPath(selected.GetInstanceID()).ToNPath();
            NPath repositoryPath = manager.Environment.GetRepositoryPath(assetPath);

            var alreadyLocked = locks.Any(x => repositoryPath == x.Path);

            if (alreadyLocked)
            {
                return(false);
            }

            GitFileStatus status = GitFileStatus.None;

            if (entries != null)
            {
                status = entries.FirstOrDefault(x => repositoryPath == x.Path.ToNPath()).Status;
            }
            return(status != GitFileStatus.Untracked && status != GitFileStatus.Ignored);
        }
예제 #4
0
        public static Texture2D GetFileStatusIcon(GitFileStatus status, bool isLocked)
        {
            if (isLocked)
            {
                switch (status)
                {
                case GitFileStatus.Modified:
                    return(Utility.GetIcon("locked.png", "*****@*****.**"));

                default:
                    return(Utility.GetIcon("locked-by-person.png", "*****@*****.**"));
                }
            }

            switch (status)
            {
            case GitFileStatus.Modified:
                return(Utility.GetIcon("modified.png", "*****@*****.**"));

            case GitFileStatus.Added:
                return(Utility.GetIcon("added.png", "*****@*****.**"));

            case GitFileStatus.Deleted:
                return(Utility.GetIcon("removed.png", "*****@*****.**"));

            case GitFileStatus.Renamed:
                return(Utility.GetIcon("renamed.png", "*****@*****.**"));

            case GitFileStatus.Untracked:
                return(Utility.GetIcon("untracked.png", "*****@*****.**"));
            }

            return(null);
        }
예제 #5
0
        private static bool ContextMenu_CanLock()
        {
            if (isBusy)
            {
                return(false);
            }
            if (Repository == null || !Repository.CurrentRemote.HasValue)
            {
                return(false);
            }

            var selected = Selection.activeObject;

            if (selected == null)
            {
                return(false);
            }
            if (locks == null)
            {
                return(false);
            }

            NPath assetPath      = AssetDatabase.GetAssetPath(selected.GetInstanceID()).ToNPath();
            NPath repositoryPath = manager.Environment.GetRepositoryPath(assetPath);

            var           alreadyLocked = locks.Any(x => repositoryPath == x.Path);
            GitFileStatus status        = GitFileStatus.None;

            if (entries != null)
            {
                status = entries.FirstOrDefault(x => repositoryPath == x.Path.ToNPath()).Status;
            }
            return(!alreadyLocked && status != GitFileStatus.Untracked && status != GitFileStatus.Ignored);
        }
예제 #6
0
        public GitStatusEntry CreateGitStatusEntry(string path, GitFileStatus status, string originalPath = null, bool staged = false)
        {
            var npath        = new NPath(path).MakeAbsolute();
            var relativePath = npath.RelativeTo(environment.RepositoryPath);
            var projectPath  = npath.RelativeTo(environment.UnityProjectPath);

            return(new GitStatusEntry(relativePath, npath, projectPath, status, originalPath?.ToNPath(), staged));
        }
예제 #7
0
        public GitStatusEntry CreateGitStatusEntry(string path, GitFileStatus indexStatus, GitFileStatus workTreeStatus = GitFileStatus.None, string originalPath = null)
        {
            var absolutePath = new NPath(path).MakeAbsolute();
            var relativePath = absolutePath.RelativeTo(environment.RepositoryPath);
            var projectPath  = absolutePath.RelativeTo(environment.UnityProjectPath);

            return(new GitStatusEntry(relativePath, absolutePath, projectPath, indexStatus, workTreeStatus, originalPath?.ToNPath()));
        }
예제 #8
0
        /// <summary>
        /// Called by solution explorer to provide tooltips for items. Returns a text describing the source control status of the item.
        /// </summary>
        public int GetGlyphTipText([InAttribute] IVsHierarchy phierHierarchy, [InAttribute] uint itemidNode, out string pbstrTooltipText)
        {
            pbstrTooltipText = "";
            GitFileStatus status = GetFileStatus(phierHierarchy, itemidNode);

            pbstrTooltipText = status.ToString(); //TODO: use resources
            return(VSConstants.S_OK);
        }
        /// <summary>
        /// Provide source control icons for the specified files and returns scc status of files
        /// </summary>
        /// <returns>The method returns S_OK if at least one of the files is controlled, S_FALSE if none of them are</returns>
        public int GetSccGlyph([InAttribute] int cFiles, [InAttribute] string[] rgpszFullPaths, [OutAttribute] VsStateIcon[] rgsiGlyphs, [OutAttribute] uint[] rgdwSccStatus)
        {
            Debug.Assert(cFiles == 1, "Only getting one file icon at a time is supported");
            // Return the icons and the status. While the status is a combination a flags, we'll return just values
            // with one bit set, to make life easier for GetSccGlyphsFromStatus

            if (rgpszFullPaths[0] == null)
            {
                return(0);
            }

            GitFileStatus status = _active ? GetFileStatus(rgpszFullPaths[0]) : GitFileStatus.NotControlled;

            //Debug.WriteLine("==== GetSccGlyph {0} : {1}", rgpszFullPaths[0], status);

            if (rgdwSccStatus != null)
            {
                rgdwSccStatus[0] = (uint)__SccStatus.SCC_STATUS_CONTROLLED;
            }

            switch (status)
            {
            case GitFileStatus.Tracked:
                rgsiGlyphs[0] = GitSccOptions.Current.UseTGitIconSet ?
                                (VsStateIcon)(this._customSccGlyphBaseIndex + (uint)CustomSccGlyphs.Tracked) :
                                VsStateIcon.STATEICON_CHECKEDIN;
                break;

            case GitFileStatus.Modified:
                rgsiGlyphs[0] = GitSccOptions.Current.UseTGitIconSet ?
                                (VsStateIcon)(this._customSccGlyphBaseIndex + (uint)CustomSccGlyphs.Modified):
                                VsStateIcon.STATEICON_CHECKEDOUT;
                break;

            case GitFileStatus.New:
                rgsiGlyphs[0] = (VsStateIcon)(this._customSccGlyphBaseIndex + (uint)CustomSccGlyphs.Untracked);
                break;

            case GitFileStatus.Added:
            case GitFileStatus.Staged:
                rgsiGlyphs[0] = (VsStateIcon)(this._customSccGlyphBaseIndex + (uint)CustomSccGlyphs.Staged);
                break;

            case GitFileStatus.NotControlled:
                rgsiGlyphs[0] = VsStateIcon.STATEICON_BLANK;
                break;

            case GitFileStatus.Ignored:
                rgsiGlyphs[0] = VsStateIcon.STATEICON_EXCLUDEDFROMSCC;
                break;

            case GitFileStatus.Conflict:
                rgsiGlyphs[0] = VsStateIcon.STATEICON_DISABLED;
                break;
            }

            return(VSConstants.S_OK);
        }
예제 #10
0
        private static bool IsChangedStatus(GitFileStatus status)
        {
            switch (status)
            {
            case GitFileStatus.NotControlled:
                return(false);

            case GitFileStatus.New:
                return(true);

            case GitFileStatus.Tracked:
                return(true);

            case GitFileStatus.Modified:
                return(true);

            case GitFileStatus.Staged:
                return(true);

            case GitFileStatus.Removed:
                return(true);

            case GitFileStatus.Added:
                return(true);

            case GitFileStatus.Deleted:
                return(true);

            case GitFileStatus.Conflict:
                return(true);

            case GitFileStatus.Merged:
                return(true);

            case GitFileStatus.Ignored:
                return(false);

            case GitFileStatus.Renamed:
                return(true);

            case GitFileStatus.Copied:
                return(true);

            case GitFileStatus.Nonexistent:
                return(false);

            case GitFileStatus.Unaltered:
                return(false);

            case GitFileStatus.Unreadable:
                return(false);

            default:
                return(false);
            }
        }
예제 #11
0
 public GitFile(
     string workFolderPath,
     string filePath,
     string oldFilePath,
     GitFileStatus status)
 {
     FilePath       = filePath;
     OldFilePath    = oldFilePath;
     WorkFolderPath = workFolderPath;
     Status         = status;
 }
예제 #12
0
        public static GitFileStatus ParseStatusMarker(char changeFlag)
        {
            GitFileStatus status = GitFileStatus.None;

            switch (changeFlag)
            {
            case 'M':
                status = GitFileStatus.Modified;
                break;

            case 'A':
                status = GitFileStatus.Added;
                break;

            case 'D':
                status = GitFileStatus.Deleted;
                break;

            case 'R':
                status = GitFileStatus.Renamed;
                break;

            case 'C':
                status = GitFileStatus.Copied;
                break;

            case 'U':
                status = GitFileStatus.Unmerged;
                break;

            case 'T':
                status = GitFileStatus.TypeChange;
                break;

            case 'X':
                status = GitFileStatus.Unknown;
                break;

            case 'B':
                status = GitFileStatus.Broken;
                break;

            case '?':
                status = GitFileStatus.Untracked;
                break;

            case '!':
                status = GitFileStatus.Ignored;
                break;

            default: break;
            }
            return(status);
        }
예제 #13
0
 public GitStatusEntry(string path, string fullPath, string projectPath,
                       GitFileStatus status,
                       string originalPath = null, bool staged = false)
 {
     Path         = path;
     Status       = status;
     FullPath     = fullPath;
     ProjectPath  = projectPath;
     OriginalPath = originalPath;
     Staged       = staged;
 }
예제 #14
0
        internal void CompareFile(string fileName)
        {
            GitFileStatus status = GetFileStatus(fileName);

            if (status == GitFileStatus.Modified || status == GitFileStatus.Staged)
            {
                string tempFile = Path.GetFileName(fileName);
                tempFile = Path.Combine(Path.GetTempPath(), tempFile);
                CurrentTracker.SaveFileFromRepository(fileName, tempFile);
                _sccProvider.RunDiffCommand(tempFile, fileName);
            }
        }
        /// <summary>
        /// Called by solution explorer to provide tooltips for items. Returns a text describing the source control status of the item.
        /// </summary>
        public int GetGlyphTipText([In] IVsHierarchy phierHierarchy, [InAttribute] uint itemidNode, out string pbstrTooltipText)
        {
            pbstrTooltipText = "";
            GitFileStatus status = ThreadHelper.JoinableTaskFactory.Run(async delegate
            {
                GitFileStatus fileStatus = await GetFileStatus(phierHierarchy, itemidNode);
                return(fileStatus);
            });

            pbstrTooltipText = status.ToString(); //TODO: use resources
            return(VSConstants.S_OK);
        }
예제 #16
0
        public GitStatusEntry(string path, string fullPath, string projectPath, GitFileStatus status,
                              string originalPath = null, bool staged = false)
        {
            Guard.ArgumentNotNullOrWhiteSpace(path, "path");
            Guard.ArgumentNotNullOrWhiteSpace(fullPath, "fullPath");

            this.path         = path;
            this.status       = status;
            this.fullPath     = fullPath;
            this.projectPath  = projectPath;
            this.originalPath = originalPath;
            this.staged       = staged;
        }
예제 #17
0
        public GitStatusEntry(string path, string fullPath, string projectPath,
                              GitFileStatus indexStatus, GitFileStatus workTreeStatus,
                              string originalPath = null)
        {
            Guard.ArgumentNotNullOrWhiteSpace(path, "path");
            Guard.ArgumentNotNullOrWhiteSpace(fullPath, "fullPath");

            this.path           = path;
            this.indexStatus    = indexStatus;
            this.workTreeStatus = workTreeStatus;
            this.fullPath       = fullPath;
            this.projectPath    = projectPath;
            this.originalPath   = originalPath;
        }
예제 #18
0
 private void menuCompare_Click(object sender, RoutedEventArgs e)
 {
     GetSelectedFileName(fileName =>
     {
         GitFileStatus status = this.tracker.GetFileStatus(fileName);
         if (status == GitFileStatus.Modified || status == GitFileStatus.Staged)
         {
             string tempFile = Path.GetFileName(fileName);
             tempFile        = Path.Combine(Path.GetTempPath(), tempFile);
             this.tracker.SaveFileFromLastCommit(fileName, tempFile);
             fileName = Path.Combine(this.tracker.WorkingDirectory, fileName);
             toolWindow.DiffService.OpenComparisonWindow(tempFile, fileName);
         }
     });
 }
예제 #19
0
 public GitConflictFile(
     string workfolderPath,
     string filePath,
     string baseId,
     string localId,
     string remoteId,
     GitFileStatus status)
 {
     FilePath       = filePath;
     BaseId         = baseId;
     LocalId        = localId;
     RemoteId       = remoteId;
     WorkfolderPath = workfolderPath;
     Status         = status;
 }
예제 #20
0
        public void setStatusFromFileStatus(FileStatus status)
        {
            switch (status)
            {
            case FileStatus.Nonexistent:
                State = GitFileStatus.Nonexistent;
                break;

            case FileStatus.Unaltered:
                State = GitFileStatus.Unaltered;
                break;

            case FileStatus.NewInIndex:
            case FileStatus.NewInWorkdir:
                State = GitFileStatus.Added;
                break;

            case FileStatus.DeletedFromIndex:
            case FileStatus.DeletedFromWorkdir:
                State = GitFileStatus.Removed;
                break;

            case FileStatus.RenamedInIndex:
            case FileStatus.RenamedInWorkdir:
                State = GitFileStatus.Renamed;
                break;

            case FileStatus.TypeChangeInIndex:
            case FileStatus.TypeChangeInWorkdir:
            case FileStatus.ModifiedInIndex:
            case FileStatus.ModifiedInWorkdir:
                State = GitFileStatus.Modified;
                break;

            case FileStatus.Unreadable:
                State = GitFileStatus.Unreadable;
                break;

            case FileStatus.Ignored:
                State = GitFileStatus.Ignored;
                break;

            case FileStatus.Conflicted:
                State = GitFileStatus.Conflicted;
                break;
            }
        }
예제 #21
0
        private IReadOnlyList <GitFile> ParseFiles(CmdResult2 result)
        {
            List <GitFile> files = new List <GitFile>();

            foreach (string line in result.OutputLines)
            {
                string filePath = line.Substring(2).Trim();

                GitFileStatus status = GitFileStatus.Modified;

                if (line.StartsWith("DD ") ||
                    line.StartsWith("AU ") ||
                    line.StartsWith("UA "))
                {
                    // How to do reproduce this ???
                    status = GitFileStatus.Conflict;
                }
                else if (line.StartsWith("UU "))
                {
                    status = GitFileStatus.Conflict | GitFileStatus.ConflictMM;
                }
                else if (line.StartsWith("AA "))
                {
                    status = GitFileStatus.Conflict | GitFileStatus.ConflictAA;
                }
                else if (line.StartsWith("UD "))
                {
                    status = GitFileStatus.Conflict | GitFileStatus.ConflictMD;
                }
                else if (line.StartsWith("DU "))
                {
                    status = GitFileStatus.Conflict | GitFileStatus.ConflictDM;
                }
                else if (line.StartsWith("?? ") || line.StartsWith(" A "))
                {
                    status = GitFileStatus.Added;
                }
                else if (line.StartsWith(" D ") || line.StartsWith("D"))
                {
                    status = GitFileStatus.Deleted;
                }

                files.Add(new GitFile(result.WorkingDirectory, filePath, null, status));
            }

            return(files);
        }
예제 #22
0
        private GitConflicts ParseConflicts(CmdResult2 result)
        {
            List <GitConflictFile> files = new List <GitConflictFile>();

            string filePath = null;
            string baseId   = null;
            string localId  = null;
            string remoteId = null;

            // Parsing lines, where there are 1,2 or 3 lines for one file before the next file lines
            foreach (string line in result.OutputLines)
            {
                string[] parts1 = line.Split("\t".ToCharArray());
                string[] parts2 = parts1[0].Split(" ".ToCharArray());
                string   path   = parts1[1].Trim();

                if (path != filePath && filePath != null)
                {
                    // Next file, store previous file
                    GitFileStatus status = GetConflictStatus(baseId, localId, remoteId);
                    if (status.HasFlag(GitFileStatus.Conflict))
                    {
                        files.Add(new GitConflictFile(result.WorkingDirectory, filePath, baseId, localId, remoteId, status));
                    }

                    baseId   = null;
                    localId  = null;
                    remoteId = null;
                }

                filePath = path;
                SetIds(parts2, ref baseId, ref localId, ref remoteId);
            }

            if (filePath != null)
            {
                // Add last file
                GitFileStatus status = GetConflictStatus(baseId, localId, remoteId);
                if (status.HasFlag(GitFileStatus.Conflict))
                {
                    files.Add(new GitConflictFile(result.WorkingDirectory, filePath, baseId, localId, remoteId, status));
                }
            }

            return(new GitConflicts(files));
        }
예제 #23
0
 private void menuUndo_Click(object sender, RoutedEventArgs e)
 {
     GetSelectedFileFullName(fileName =>
     {
         GitFileStatus status = tracker.GetFileStatus(fileName);
         if (status == GitFileStatus.Modified || status == GitFileStatus.Staged ||
             status == GitFileStatus.Deleted || status == GitFileStatus.Removed)
         {
             if (MessageBox.Show("Are you sure you want to undo changes for " + Path.GetFileName(fileName) +
                                 " and restore a version from the last commit? ",
                                 "Undo Changes", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
             {
                 tracker.CheckOutFile(fileName);
             }
         }
     }, false); // file must exists check flag is false
 }
        /// <summary>
        /// Send filename and status, and returns true if file status is different than last known status
        /// </summary>
        /// <param name="filename"></param>
        /// <param name="status"></param>
        /// <returns></returns>
        public bool StatusChanged(string filename, GitFileStatus status)
        {
            var file = filename.ToLower();
            ChangesetFileStatus fileStatus;


            if (_fileStatus.TryGetValue(file, out fileStatus))
            {
                if (!fileStatus.IsStale && fileStatus.Status == status)
                {
                    return(false);
                }
                _fileStatus[file] = new ChangesetFileStatus(status);
                return(true);
            }

            _fileStatus.TryAdd(file, new ChangesetFileStatus(status));
            return(true);
        }
예제 #25
0
        /// <summary>
        /// Send filename and status, and returns true if file status is different than last known status
        /// </summary>
        /// <param name="filename"></param>
        /// <param name="status"></param>
        /// <returns></returns>
        public bool StatusChanged(string filename, GitFileStatus status)
        {
            var file       = filename.ToLower();
            var fileStatus = GitFileStatus.NotControlled;


            if (_fileStatus.TryGetValue(file, out fileStatus))
            {
                if (fileStatus == status)
                {
                    return(false);
                }
                _fileStatus[file] = status;
                return(true);
            }

            _fileStatus.TryAdd(file, status);
            return(true);
        }
예제 #26
0
        public IEnumerable <HunkRangeInfo> GetGitDiffFor(ITextDocument textDocument, ITextSnapshot snapshot)
        {
            string fileName = textDocument.FilePath;
            GitFileStatusTracker tracker = new GitFileStatusTracker(Path.GetDirectoryName(fileName));

            if (!tracker.IsGit)
            {
                yield break;
            }

            GitFileStatus status = tracker.GetFileStatus(fileName);

            if (status == GitFileStatus.New || status == GitFileStatus.Added)
            {
                yield break;
            }

            HistogramDiff diff = new HistogramDiff();

            diff.SetFallbackAlgorithm(null);
            string currentText = snapshot.GetText();

            byte[] preamble = textDocument.Encoding.GetPreamble();
            byte[] content  = textDocument.Encoding.GetBytes(currentText);
            if (preamble.Length > 0)
            {
                byte[] completeContent = new byte[preamble.Length + content.Length];
                Buffer.BlockCopy(preamble, 0, completeContent, 0, preamble.Length);
                Buffer.BlockCopy(content, 0, completeContent, preamble.Length, content.Length);
                content = completeContent;
            }

            byte[]   previousContent = null; //GetPreviousRevision(tracker, fileName);
            RawText  b     = new RawText(content);
            RawText  a     = new RawText(previousContent ?? new byte[0]);
            EditList edits = diff.Diff(RawTextComparator.DEFAULT, a, b);

            foreach (Edit edit in edits)
            {
                yield return(new HunkRangeInfo(snapshot, edit, a, b));
            }
        }
        //public void Clear()
        //{
        //    _currentChangeset = new List<GitFile>();
        //    _fileStatus = new ConcurrentDictionary<string, GitFileStatus>();
        //}


        //public GitFileStatus GetFileStatus(string fileName)
        //{
        //    try
        //    {
        //        fileName = Path.GetFullPath(fileName).ToLower();
        //        var file = _currentChangeset.FirstOrDefault(f => string.Equals(f.FilePath, fileName, StringComparison.OrdinalIgnoreCase));
        //        if (file != null) return file.Status;

        //        if (FileExistsInRepo(fileName)) return GitFileStatus.Tracked;
        //        // did not check if the file is ignored for performance reason
        //        return GitFileStatus.NotControlled;
        //    }
        //    catch (Exception ex)
        //    {
        //        Debug.WriteLine("Error In File System Changed Event: " + ex.Message);
        //        return GitFileStatus.NotControlled;
        //    }
        //}

        //private bool FileExistsInRepo(string fileName)
        //{
        //    return File.Exists(Path.Combine(_repostory.WorkingDirectory, fileName));
        //}

        /// <summary>
        /// Send filename and status, and returns true if file status is different than last known status
        /// </summary>
        /// <param name="filename"></param>
        /// <param name="status"></param>
        /// <returns></returns>
        public bool StatusChanged(string filename, GitFileStatus status)
        {

            var file = filename.ToLower();
            var fileStatus = GitFileStatus.NotControlled;


            if (_fileStatus.TryGetValue(file, out fileStatus))
            {
                if (fileStatus == status)
                {
                    return false;
                }
                _fileStatus[file] = status;
                return true;
            }

            _fileStatus.TryAdd(file, status);
            return true;
        }
 public static bool IsChangedStatus(GitFileStatus status)
 {
     
     switch (status)
     {
         case GitFileStatus.NotControlled:
             return false;
         case GitFileStatus.New:
             return true;
         case GitFileStatus.Tracked:
             return false;
         case GitFileStatus.Modified:
             return true;
         case GitFileStatus.Staged:
             return true;
         case GitFileStatus.Removed:
             return true;
         case GitFileStatus.Added:
             return true;
         case GitFileStatus.Deleted:
             return true;
         case GitFileStatus.Conflict:
             return true;
         case GitFileStatus.Merged:
             return true;
         case GitFileStatus.Ignored:
             return false;
         case GitFileStatus.Renamed:
             return true;
         case GitFileStatus.Copied:
             return true;
         case GitFileStatus.Nonexistent:
             return false;
         case GitFileStatus.Unaltered:
             return false;
         case GitFileStatus.Unreadable:
             return false;
         default:
             return false;
     }
 }
예제 #29
0
        private static bool ContextMenu_CanLock()
        {
            if (isBusy)
            {
                Logger.Trace("is busy can't lock");
                return(false);
            }
            if (repository == null || !repository.CurrentRemote.HasValue)
            {
                Logger.Trace("can't lock, repository is null or there's not remote");
                return(false);
            }
            var selected = Selection.activeObject;

            if (selected == null)
            {
                Logger.Trace("can't lock, selected is null");
                return(false);
            }

            if (locks == null)
            {
                Logger.Trace("can't lock, locks is null");
                return(false);
            }
            NPath assetPath      = AssetDatabase.GetAssetPath(selected.GetInstanceID()).ToNPath();
            NPath repositoryPath = EntryPoint.Environment.GetRepositoryPath(assetPath);

            var alreadyLocked = locks.Any(x =>
            {
                return(repositoryPath == x.Path.ToNPath());
            });
            GitFileStatus status = GitFileStatus.None;

            if (entries != null)
            {
                status = entries.FirstOrDefault(x => repositoryPath == x.Path.ToNPath()).Status;
            }
            Logger.Trace("checking if can lock, already locked? {0}, status {1}", alreadyLocked, status);
            return(!alreadyLocked && status != GitFileStatus.Untracked && status != GitFileStatus.Ignored);
        }
예제 #30
0
        public void RefreshPending(List <string> porcelains)
        {
            if (_gitRepository.TryGetTarget(out IGitRepository gitRepository) == false)
            {
                return;
            }
            var modified_backup     = new SelectionRecover(ModifiedList);
            var staged_backup       = new SelectionRecover(StagedList);
            var collecting_staged   = new ObservableCollection <FileStatus>();
            var collecting_modified = new ObservableCollection <FileStatus>();

            foreach (var porcelain in porcelains)
            {
                GitFileStatus status = GitPorcelainParser.ParseFileStatus(porcelain);
                if (status.Staged != null)
                {
                    AddStagedList(status.Staged, staged_backup, collecting_staged);
                }
                if (status.Unmerged != null)
                {
                    AddModifiedList(status.Unmerged, modified_backup, collecting_modified);
                }
                if (status.Modified != null)
                {
                    AddModifiedList(status.Modified, modified_backup, collecting_modified);
                }
            }
            StagedList   = collecting_staged;
            ModifiedList = collecting_modified;

            NotifyPropertyChanged("StagedList");
            NotifyPropertyChanged("ModifiedList");

            if (ModifiedList.Count == 0 && StagedList.Count == 0)
            {
                gitRepository.AddLog("Nothing changed");
            }
        }
예제 #31
0
        public void CheckOutFile(string fileName)
        {
            if (!this.HasGitRepository || this.head == null)
            {
                return;
            }

            string fileNameRel = GetRelativeFileName(fileName);

            if (GitBash.Exists)
            {
                GitBash.Run(string.Format("checkout -- \"{0}\"", fileNameRel), this.GitWorkingDirectory);
            }
            else
            {
                GitFileStatus status = GetFileStatus(fileName);
                SaveFileFromRepository(fileName, fileName);
                if (status == GitFileStatus.Staged || status == GitFileStatus.Removed)
                {
                    UnStageFile(fileName);
                }
            }
        }
 public void SetStatus(string filename, GitFileStatus status)
 {
     if (!String.IsNullOrWhiteSpace(filename))
     {
         var fileKey      = filename.ToLower();
         var changeStatus = GitFile.IsChangedStatus(status) ? status : GitFileStatus.Unaltered;
         if (_fileStatus.ContainsKey(fileKey))
         {
             if (changeStatus == GitFileStatus.Unaltered)
             {
                 ChangesetFileStatus dStatus;
                 _fileStatus.TryRemove(fileKey, out dStatus);
             }
             else
             {
                 _fileStatus.AddOrUpdate(fileKey, new ChangesetFileStatus(changeStatus), (key, val) => new ChangesetFileStatus(changeStatus));
             }
         }
         else if (changeStatus != GitFileStatus.Unaltered)
         {
             _fileStatus.AddOrUpdate(fileKey, new ChangesetFileStatus(changeStatus), (key, val) => new ChangesetFileStatus(changeStatus));
         }
     }
 }