From: Pete Wyckoff <pw@padd.com>
To: Vitor Antunes <vitor.hda@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH 2/3] git-p4: Search for parent commit on branch creation
Date: Mon, 16 Jan 2012 13:57:38 -0500 [thread overview]
Message-ID: <20120116185738.GA21996@padd.com> (raw)
In-Reply-To: <1326674360-2771-3-git-send-email-vitor.hda@gmail.com>
vitor.hda@gmail.com wrote on Mon, 16 Jan 2012 00:39 +0000:
> To find out which is its parent the commit of the new branch is applied
> sequentially to each blob of the parent branch from the newest to the
> oldest. The first blob which results in a zero diff is considered the
> parent commit. If none is found, then the commit is applied to the top
> of the parent branch.
>
> A fast-import "checkpoint" call is required for each comparison because
> diff-tree is only able to work with blobs on disk. But most of these
> commits will not be part of the final imported tree, making fast-import
> fail. To avoid this, the temporary branches are tracked and then removed
> at the end of the import process.
This looks much better without the need for "--force". It'll be
great to fix this major branch detection problem. Can you make a
couple of further minor changes?
> diff --git a/contrib/fast-import/git-p4 b/contrib/fast-import/git-p4
> @@ -2012,7 +2014,28 @@ class P4Sync(Command, P4UserMap):
> - self.commit(description, filesForCommit, branch, [branchPrefix], parent)
> + parentFound = 0
> + if len(parent) > 0:
> + self.checkpoint()
> + for blob in read_pipe_lines("git rev-list --reverse --no-merges %s" % parent):
> + blob = blob.strip()
> + tempBranch = self.tempBranchLocation + os.sep + "%d-%s" % (change, blob)
> + if self.verbose:
> + print "Creating temporary branch: " + tempBranch
> + self.commit(description, filesForCommit, tempBranch, [branchPrefix], blob)
> + self.tempBranches.append(tempBranch)
> + self.checkpoint()
> + if len( read_pipe("git diff-tree %s %s" % (blob, tempBranch)) ) == 0:
> + parentFound = 1
> + if self.verbose:
> + print "Found parent of %s in commit %s" % (branch, blob)
> + break
> + if parentFound:
> + self.commit(description, filesForCommit, branch, [branchPrefix], blob)
> + else:
> + if self.verbose:
> + print "Parent of %s not found. Committing into head of %s" % (branch, parent)
> + self.commit(description, filesForCommit, branch, [branchPrefix], parent)
1. Move the tempBranch commit outside of the "for blob" loop.
It can have no parent, and the diff-tree will still tell you
if you found the same contents. Instead of a ref for
each blob inspected for each change, you'll just have one ref
per change. Only one checkpoint() after the tempBranch
commit should be needed.
2. Nit. parentFound is boolean, use True/False, not 1/0.
> @@ -2347,6 +2370,12 @@ class P4Sync(Command, P4UserMap):
> + # Cleanup temporary branches created during import
> + if self.tempBranches != []:
> + for branch in self.tempBranches:
> + os.remove(".git" + os.sep + branch)
> + os.rmdir(".git" + os.sep + self.tempBranchLocation)
> +
3. Deleting refs should probably use "git update-ref -d"
just in case GIT_DIR is not ".git". I think you could just
leave the "git-p4-tmp" directory around, but use
os.environ["GIT_DIR"] instead of ".git" if you want to
delete it.
4. Paths are best manipulated with os.path.join(dir, file), to handle
weirdnesses like drive letters.
Eventually if the fast-import protocol learns to delete the refs
it creates, we can clean up a bit more nicely. I think there was
agreement this was a good idea, just needs someone to do it
sometime.
-- Pete
next prev parent reply other threads:[~2012-01-16 18:57 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-16 0:39 [PATCH 0/3] git-p4: Search for parent commit on branch creation Vitor Antunes
2012-01-16 0:39 ` [PATCH 1/3] git-p4: Add checkpoint() task Vitor Antunes
2012-01-16 0:39 ` [PATCH 2/3] git-p4: Search for parent commit on branch creation Vitor Antunes
2012-01-16 18:57 ` Pete Wyckoff [this message]
2012-01-16 23:41 ` Vitor Antunes
2012-01-17 0:10 ` Vitor Antunes
2012-01-17 22:18 ` Pete Wyckoff
2012-01-17 23:43 ` Vitor Antunes
2012-01-16 0:39 ` [PATCH 3/3] git-p4: Add test case for complex branch import Vitor Antunes
2012-01-16 19:12 ` Pete Wyckoff
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=20120116185738.GA21996@padd.com \
--to=pw@padd.com \
--cc=git@vger.kernel.org \
--cc=vitor.hda@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).