[PATCH 1/2] Update git to use "git diff-index" instead of "git status"
- From: Peter Tyser <ptyser gmail com>
- To: meld-list gnome org
- Cc: grant b edwards gmail com
- Subject: [PATCH 1/2] Update git to use "git diff-index" instead of "git status"
- Date: Sun, 28 Feb 2010 14:42:02 -0600
"git status" is a "porcelain" command whose output is shown in a format
that is easy for a user to digest. The output formatting can change as
it is not considered a "plumbing" git command.
By using "git diff-index" instead of "git status" we reduce the chance
that meld will mis-parse a git tree's current status if/when the output
of "git status" changes. Additionally, "git diff-index"'s output is
much easier to parse which simplifies meld's code a bit.
Lastly, unlike "git status", "git diff-index" can be used to only
show the changed files in a specific repository location. "git status"
is only able to show all changed files in a repository. This feature
of "diff-index" will be useful when updating meld to properly parse
git repositories' sub-directories. (see bug 609025)
Signed-off-by: Peter Tyser <ptyser gmail com>
---
I saw Grant Edwards email at http://article.gmane.org/gmane.comp.gnome.meld.general/1024
and the same issue has bugged me for a while too. These 2 patches are my
attempt to fix it. I'm not intimately familiar with meld's internals,
so be gentle:)
Thanks for a great tool!
Peter
meld/vc/git.py | 42 ++++++++++++------------------------------
1 files changed, 12 insertions(+), 30 deletions(-)
diff --git a/meld/vc/git.py b/meld/vc/git.py
index 833b9b2..4067692 100644
--- a/meld/vc/git.py
+++ b/meld/vc/git.py
@@ -39,12 +39,12 @@ class Vc(_vc.CachedVc):
PATCH_STRIP_NUM = 1
PATCH_INDEX_RE = "^diff --git a/(.*) b/.*$"
state_map = {
- "unknown": _vc.STATE_NONE,
- "new file": _vc.STATE_NEW,
- "deleted": _vc.STATE_REMOVED,
- "modified": _vc.STATE_MODIFIED,
- "typechange": _vc.STATE_MODIFIED,
- "unmerged": _vc.STATE_CONFLICT,
+ "X": _vc.STATE_NONE, # Unknown
+ "A": _vc.STATE_NEW, # New
+ "D": _vc.STATE_REMOVED, # Deleted
+ "M": _vc.STATE_MODIFIED, # Modified
+ "T": _vc.STATE_MODIFIED, # Type-changed
+ "U": _vc.STATE_CONFLICT, # Unmerged
}
def check_repo_root(self, location):
@@ -74,7 +74,7 @@ class Vc(_vc.CachedVc):
def _lookup_tree_cache(self, rootdir):
while 1:
try:
- proc = _vc.popen([self.CMD, "status", "--untracked-files"], cwd=self.root)
+ proc = _vc.popen([self.CMD, "diff-index", "--name-status", "HEAD", "./"], cwd=self.root)
entries = proc.read().split("\n")[:-1]
break
except OSError, e:
@@ -82,29 +82,11 @@ class Vc(_vc.CachedVc):
raise
tree_state = {}
for entry in entries:
- if not entry.startswith("#\t"):
- continue
- try:
- statekey, name = entry[2:].split(":", 2)
- except ValueError:
- # untracked
- name = entry[2:]
- path = os.path.join(self.root, name.strip())
- tree_state[path] = _vc.STATE_NONE
- else:
- statekey = statekey.strip()
- name = name.strip()
- try:
- src, dst = name.split(" -> ", 2)
- except ValueError:
- path = os.path.join(self.root, name.strip())
- state = self.state_map.get(statekey, _vc.STATE_NONE)
- tree_state[path] = state
- else:
- # copied, renamed
- if statekey == "renamed":
- tree_state[os.path.join(self.root, src)] = _vc.STATE_REMOVED
- tree_state[os.path.join(self.root, dst)] = _vc.STATE_NEW
+ statekey, name = entry.split("\t", 2)
+ path = os.path.join(self.root, name.strip())
+ state = self.state_map.get(statekey.strip(), _vc.STATE_NONE)
+ tree_state[path] = state
+
return tree_state
def _get_dirsandfiles(self, directory, dirs, files):
--
1.6.2-rc2.GIT
[
Date Prev][Date Next] [Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]