summaryrefslogtreecommitdiff
path: root/git-fat
diff options
context:
space:
mode:
authorTomas Herman <tomas.herman@wikidi.com>2013-04-23 11:59:38 +0200
committerJed Brown <jed@59A2.org>2013-04-25 09:10:32 -0500
commitc23422388b975f13867457c86c78361dfdf8036e (patch)
tree935a5cb78be17f6409de720867f584acc7d90dd6 /git-fat
parentffa7ff707229e961e809ab8f038ee6db80552a7f (diff)
downloadgit-fat-c23422388b975f13867457c86c78361dfdf8036e.tar.gz
Added support for pulling only a subset of files.
Diffstat (limited to 'git-fat')
-rwxr-xr-xgit-fat27
1 files changed, 24 insertions, 3 deletions
diff --git a/git-fat b/git-fat
index 139de3b..7bceec1 100755
--- a/git-fat
+++ b/git-fat
@@ -262,12 +262,14 @@ class GitFat(object):
p1.wait()
p2.wait()
return referenced
- def orphan_files(self):
+
+ def orphan_files(self, patterns=[]):
'generator for all orphan placeholders in the working tree'
- for fname in subprocess.check_output(['git', 'ls-files']).splitlines():
+ for fname in subprocess.check_output(['git', 'ls-files'] + patterns).splitlines():
digest = self.decode_file(fname)[0]
if digest:
yield (digest, fname)
+
def cmd_status(self, args):
self.setup()
catalog = self.catalog_objects()
@@ -330,14 +332,33 @@ class GitFat(object):
rev = self.revparse(arg)
if rev:
refargs['rev'] = rev
- files = self.referenced_objects(**refargs) - self.catalog_objects()
+ files = self.filter_objects(refargs, self.parse_pull_patterns(args))
cmd = self.get_rsync_command(push=False)
self.verbose('Executing: %s' % ' '.join(cmd))
p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
p.communicate(input='\x00'.join(files))
self.checkout()
+
+ def parse_pull_patterns(self, args):
+ if '--' not in args:
+ return ['']
+ else:
+ idx = args.index('--')
+ patterns = args[idx+1:] #we don't care about '--'
+ return patterns
+
+ def filter_objects(self, refargs, patterns):
+ files = self.referenced_objects(**refargs) - self.catalog_objects()
+ files_set = set(files)
+ orphans_matched = list(self.orphan_files(patterns))
+ print("pulling:")
+ print(map(lambda x: x[1], orphans_matched))
+ orphans_objects = set(map(lambda x: x[0], orphans_matched))
+ return files_set & orphans_objects
+
def cmd_checkout(self, args):
self.checkout(show_orphans=True)
+
def cmd_gc(self):
garbage = self.catalog_objects() - self.referenced_objects()
print('Unreferenced objects to remove: %d' % len(garbage))