From: Pete Wyckoff <pw@padd.com>
To: Elijah Newren <newren@gmail.com>
Cc: Git Mailing List <git@vger.kernel.org>
Subject: Re: Is there a scriptable way to update the stat-info in the index without having git open and read those files?
Date: Sat, 27 Aug 2011 11:18:24 -0400 [thread overview]
Message-ID: <20110827151824.GA1903@arf.padd.com> (raw)
In-Reply-To: <CABPp-BEiN7ffNmvLCvEfz056M_F36j+gV9t6J9-x_=H9q0rZFw@mail.gmail.com>
newren@gmail.com wrote on Mon, 22 Aug 2011 16:28 -0600:
> I want to do something really close to
> git update-index -q --refresh
> However, I want it to assume the files in the working tree are
> unmodified from the index (i.e. don't waste time opening and reading
> the file) and simply update the stat information in the index to match
> the current files on disk.
>
> Yes, I know that would be unsafe if the files don't have the
> appropriate contents; I'm promising that they do have the appropriate
> contents and don't want to pay the performance penalty for git to
> verify. Is that possible?
I have the same issue in my workflow, and agree with Junio that this
is just too bizarre to put in the code. Here's the script I use,
relying on dulwich, that you might find helpful.
-- Pete
------8<------------------
#!/usr/bin/env python2.6
# git-index-clone - Update index after a volume clone
# Copyright 2010 Pete Wyckoff <pw@padd.com>
import sys
import os
from dulwich.index import Index
index_name = ".git/index"
#
# Debugging option: show the index entry for just one file name,
# e.g. git-index-clone file/name/in/tree
#
def show_entry(name):
idx = Index(index_name)
if name not in idx:
print >>sys.stderr, "No index entry", name
return
print "index", idx[name]
t = update_from_stat(idx[name], name)
print "stat ", t
#
# Stat the file, return the new tuple
#
def update_from_stat(idx, name):
(ctime, mtime, dev, ino, mode, uid, gid, size, sha, flags) = idx
sb = os.lstat(name)
# times are float; dulwich converts to (sec, ns) on write
ctime = sb.st_ctime
mtime = sb.st_mtime
dev = sb.st_dev
ino = sb.st_ino
# assume mode unchanged
uid = sb.st_uid
gid = sb.st_gid
# assume size, sha, flags unchanged
return (ctime, mtime, dev, ino, mode, uid, gid, size, sha, flags)
def convert():
idx_in = Index(index_name)
os.unlink(index_name)
idx_out = Index(index_name)
for name in idx_in:
idx_out[name] = update_from_stat(idx_in[name], name)
idx_out.write()
os.chmod(index_name, 0644) # drop exec perms
def usage():
print >>sys.stderr, "Usage: %s [<index entry name>]\n"
sys.exit(1)
def main():
if len(sys.argv) == 1:
convert()
elif len(sys.argv) == 2:
show_entry(sys.argv[1])
else:
usage()
return 0
if __name__ == "__main__":
sys.exit(main())
prev parent reply other threads:[~2011-08-27 15:18 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-22 22:28 Is there a scriptable way to update the stat-info in the index without having git open and read those files? Elijah Newren
2011-08-22 22:49 ` Junio C Hamano
2011-08-27 15:18 ` Pete Wyckoff [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110827151824.GA1903@arf.padd.com \
--to=pw@padd.com \
--cc=git@vger.kernel.org \
--cc=newren@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).