From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id 27D1F431FBD for ; Sun, 9 Mar 2014 17:31:06 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Spam-Flag: NO X-Spam-Score: 0 X-Spam-Level: X-Spam-Status: No, score=0 tagged_above=-999 required=5 tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001] autolearn=disabled Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id lpwj+ECND6K5 for ; Sun, 9 Mar 2014 17:30:58 -0700 (PDT) Received: from qmta01.westchester.pa.mail.comcast.net (qmta01.westchester.pa.mail.comcast.net [76.96.62.16]) by olra.theworths.org (Postfix) with ESMTP id 6EEB3431FBC for ; Sun, 9 Mar 2014 17:30:58 -0700 (PDT) Received: from omta06.westchester.pa.mail.comcast.net ([76.96.62.51]) by qmta01.westchester.pa.mail.comcast.net with comcast id bc6b1n00616LCl051cWvBd; Mon, 10 Mar 2014 00:30:55 +0000 Received: from odin.tremily.us ([24.18.63.50]) by omta06.westchester.pa.mail.comcast.net with comcast id bcWt1n00R152l3L3ScWuha; Mon, 10 Mar 2014 00:30:55 +0000 Received: from mjolnir.tremily.us (unknown [192.168.0.140]) by odin.tremily.us (Postfix) with ESMTPS id 4C0A8106CDE1; Sun, 9 Mar 2014 17:30:52 -0700 (PDT) Received: (nullmailer pid 30098 invoked by uid 1000); Mon, 10 Mar 2014 00:28:53 -0000 From: "W. Trevor King" To: notmuch Subject: [PATCH v2] nmbug: Add 'clone' and replace FETCH_HEAD with @{upstream} Date: Sun, 9 Mar 2014 17:28:49 -0700 Message-Id: X-Mailer: git-send-email 1.8.5.2.8.g0f6c0d1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=comcast.net; s=q20121106; t=1394411455; bh=6N4BgLALsLWrkOxDEQpUbmEr/YbO/Csw8jtiXJ2YuM8=; h=Received:Received:Received:Received:From:To:Subject:Date: Message-Id:MIME-Version:Content-Type; b=dCfnl14qjuwtUC8AWw/LEFEr9sZV1SHJ1O6Pt0LZTw42yU74cMfnoikeXwDwxwNxe 26pWR2Rfsjge8Fo8zhGH7yRqHj/Z9gqKMl3eBGc8weTZsk/FJevwXj7TOUgErYUHEV MCyxPlvWSyjrGTBkfHNI8cRpZKA9n7yXxwuEWh3CQdCt80tZqJAyGIhUcqOWcrzvz1 QGDfN87e13685PFb43RYWwdNrwDY7X5X6mX2n+Ij69QKvC+bwdJte5AmfvwGS9zC2l w+sYECARuwfwIAGZ7AL5ueDZ+DC/HnrTAcEt/uSaVRHe0SesiFdnyhq0+HZ8djgOPk Z2Gl5DvUyPG4w== X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 10 Mar 2014 00:31:06 -0000 With two branches getting fetched (master and config), the branch referenced by FETCH_HEAD is ambiguous. For example, I have: $ cat FETCH_HEAD 41d7bfa7184cc93c9dac139d1674e9530799e3b0 \ not-for-merge branch 'config' of http://nmbug.tethera.net/git/nmbug-tags acd379ccb973c45713eee9db177efc530f921954 \ not-for-merge branch 'master' of http://nmbug.tethera.net/git/nmbug-tags (where I wrapped the line by hand). This means that FETCH_HEAD references the config branch: $ git rev-parse FETCH_HEAD 41d7bfa7184cc93c9dac139d1674e9530799e3b0 which breaks all of the FETCH_HEAD logic in nmbug (where FETCH_HEAD is assumed to point to the master branch). Instead of relying on FETCH_HEAD, use @{upstream} as the remote-tracking branch that should be merged/diffed/integrated into HEAD. @{upstream} was added in Git v1.7.0 (2010-02-12) [1], so relying on it should be fairly safe. One tricky bit is that bare repositories don't set upstream tracking branches by default: $ git clone --bare http://nmbug.tethera.net/git/nmbug-tags.git nmbug-bare $ cd nmbug-bare $ git remote show origin * remote origin Fetch URL: http://nmbug.tethera.net/git/nmbug-tags.git Push URL: http://nmbug.tethera.net/git/nmbug-tags.git HEAD branch: master Local refs configured for 'git push': config pushes to config (up to date) master pushes to master (up to date) While in a non-bare clone: $ git clone http://nmbug.tethera.net/git/nmbug-tags.git $ cd nmbug-tags $ git remote show origin * remote origin Fetch URL: http://nmbug.tethera.net/git/nmbug-tags.git Push URL: http://nmbug.tethera.net/git/nmbug-tags.git HEAD branch: master Remote branches: config tracked master tracked Local branch configured for 'git pull': master merges with remote master Local ref configured for 'git push': master pushes to master (up to date) >From the clone docs [2]: --bare:: Make a 'bare' Git repository… Also the branch heads at the remote are copied directly to corresponding local branch heads, without mapping them to `refs/remotes/origin/`. When this option is used, neither remote-tracking branches nor the related configuration variables are created. To use @{upstream}, we need to the local vs. remote-tracking distinction, so this commit adds 'nmbug clone', replacing the previously suggested --bare clone with a non-bare --no-checkout --separate-git-dir clone into a temporary work directory. After which: $ git rev-parse @{upstream} acd379ccb973c45713eee9db177efc530f921954 gives us the master-branch commit. Existing nmbug users will have to run the configuration tweaks and re-fetch by hand. If you don't have any local commits, you could also blow away your NMBGIT repository and re-clone from scratch: $ nmbug clone http://nmbug.tethera.net/git/nmbug-tags.git Besides removing the ambiguity of FETCH_HEAD, this commit allows users to configure which upstream branch they want nmbug to track via 'git config', in case they want to change their upstream repository. [1]: http://git.kernel.org/cgit/git/git.git/tree/Documentation/RelNotes/1.7.0.txt [2]: http://git.kernel.org/cgit/git/git.git/tree/Documentation/git-clone.txt --- Changes since v1 [1]: * Replaced confusing post-clone fetch with a single --no-checkout --separate-git-dir clone [2]. This avoids a bare repository's lack of remote-tracking branches by not creating a bare repository in the first place, while v1 tried to “fix” the bare repo. Cheers, Trevor [1]: id:80db13662a0313711ca3a91e338a63d35e64a83c.1391898002.git.wking@tremily.us http://article.gmane.org/gmane.mail.notmuch.general/17154 [2]: id:20140308162633.GM16433@odin.tremily.us http://article.gmane.org/gmane.mail.notmuch.general/17409 devel/nmbug/nmbug | 45 ++++++++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/devel/nmbug/nmbug b/devel/nmbug/nmbug index 90d98b6..d6f5213 100755 --- a/devel/nmbug/nmbug +++ b/devel/nmbug/nmbug @@ -26,6 +26,7 @@ my $ESCAPED_RX = qr{$ESCAPE_CHAR([A-Fa-f0-9]{2})}; my %command = ( archive => \&do_archive, checkout => \&do_checkout, + clone => \&do_clone, commit => \&do_commit, fetch => \&do_fetch, help => \&do_help, @@ -125,6 +126,15 @@ sub do_archive { system ('git', "--git-dir=$NMBGIT", 'archive', 'HEAD'); } +sub do_clone { + my $repository = shift; + + my $tempwork = tempdir ('/tmp/nmbug-clone.XXXXXX', CLEANUP => 1); + system ('git', 'clone', '--no-checkout', '--separate-git-dir', $NMBGIT, + $repository, $tempwork) == 0 + or die "'git clone' exited with nonzero value\n"; + git ('config', '--unset', 'core.worktree'); +} sub is_committed { my $status = shift; @@ -332,21 +342,24 @@ To discard your changes, run 'nmbug checkout' sub do_pull { my $remote = shift || 'origin'; + my $branch = shift || 'master'; git ( 'fetch', $remote); - do_merge (); + do_merge ("$remote/$branch"); } sub do_merge { + my $commit = shift || '@{upstream}'; + insist_committed (); my $tempwork = tempdir ('/tmp/nmbug-merge.XXXXXX', CLEANUP => 1); git ( { GIT_WORK_TREE => $tempwork }, 'checkout', '-f', 'HEAD'); - git ( { GIT_WORK_TREE => $tempwork }, 'merge', 'FETCH_HEAD'); + git ( { GIT_WORK_TREE => $tempwork }, 'merge', $commit); do_checkout (); } @@ -407,11 +420,10 @@ sub do_status { sub is_unmerged { + my $commit = shift || '@{upstream}'; - return 0 if (! -f $NMBGIT.'/FETCH_HEAD'); - - my $fetch_head = git ('rev-parse', 'FETCH_HEAD'); - my $base = git ( 'merge-base', 'HEAD', 'FETCH_HEAD'); + my $fetch_head = git ('rev-parse', $commit); + my $base = git ( 'merge-base', 'HEAD', $commit); return ($base ne $fetch_head); @@ -473,7 +485,7 @@ sub diff_index { sub diff_refs { my $filter = shift; my $ref1 = shift || 'HEAD'; - my $ref2 = shift || 'FETCH_HEAD'; + my $ref2 = shift || '@{upstream}'; my $fh= git_pipe ( 'diff', "--diff-filter=$filter", '--name-only', $ref1, $ref2); @@ -561,10 +573,11 @@ git. Any extra arguments are used (one per line) as a commit message. push local nmbug git state to remote repo -=item B [remote] +=item B [remote] [branch] pull (merge) remote repo changes to notmuch. B is equivalent to -B followed by B. +B followed by B. The default remote is C, and +the default branch is C. =back @@ -572,6 +585,12 @@ B followed by B. =over 8 +=item B repository + +Create a local nmbug repository from a remote source. This wraps +C, adding some options to avoid creating a working tree +while preserving remote-tracking branches and upstreams. + =item B Update the notmuch database from git. This is mainly useful to discard @@ -589,12 +608,12 @@ print help [for subcommand] =item B [parameters] A simple wrapper for git log. After running C, you can -inspect the changes with C +inspect the changes with C -=item B +=item B [commit] -Merge changes from FETCH_HEAD into HEAD, and load the result into -notmuch. +Merge changes from C into HEAD, and load the result into +notmuch. The default commit is C<@{upstream}>. =item B -- 1.8.5.2.8.g0f6c0d1