On 01/27/2017 10:58 PM, demerphq wrote:

On 28 Jan 2017 6:32 a.m., "James E Keenan" <jk...@verizon.net
<mailto:jk...@verizon.net>> wrote:

    On 01/14/2017 10:10 AM, James E Keenan wrote:
    Here is the first part of the smokecurrent.log for this run -- with
    some comments:

    #####
    [2017-01-27 08:11:22-0500] Read configuration from:
    /usr/home/jkeenan/p5smoke/install/smokecurrent_config
    [2017-01-27 08:11:22-0500] Commitlevel before sync:
    d6115793d6cc41755a3ed4baaa38d30653656f41

    # d611579 was HEAD in the previous branch being smoked:
    smoke-me/jkeenan/130635-storable

    [2017-01-27 08:11:22-0500] ==> Starting synctree
    [2017-01-27 08:11:22-0500] Reading branch to smoke from:
    '/usr/home/jkeenan/p5smoke/install/smokecurrent.gitbranch'
    [2017-01-27 08:11:22-0500] In
    pwd(/usr/home/jkeenan/p5smoke/git-perl) running:
    [2017-01-27 08:11:22-0500] qx[/usr/local/bin/git pull --all]
    From git://perl5.git.perl.org/perl <http://perl5.git.perl.org/perl>
       1f74a12..9a7b7fb  blead      -> origin/blead
    [2017-01-27 08:11:37-0500] Fetching origin
    [2017-01-27 08:11:37-0500] Already up-to-date.
    [2017-01-27 08:11:37-0500] In
    pwd(/usr/home/jkeenan/p5smoke/git-perl) running:
    [2017-01-27 08:11:37-0500] qx[/usr/local/bin/git remote prune origin]
    [2017-01-27 08:11:38-0500] In
    pwd(/usr/home/jkeenan/p5smoke/git-perl) running:
    [2017-01-27 08:11:38-0500] qx[/usr/local/bin/git checkout blead
    [2017-01-27 08:11:38-0500]  2>&1]
    Switched to branch 'blead'
    [2017-01-27 08:11:41-0500] Your branch is behind 'origin/blead' by 7
    commits, and can be fast-forwarded.
    [2017-01-27 08:11:41-0500]   (use "git pull" to update your local
    branch)

    # Note: No indication that 'git pull' was actually run!  Why not?

    [2017-01-27 08:11:41-0500] In
    pwd(/usr/home/jkeenan/p5smoke/perl-current) running:
    [2017-01-27 08:11:41-0500] qx[/usr/local/bin/git reset --hard]

    # Note: Although 'man git-reset' is not explicit about this, we can
    probably assume
    # that 'git reset --hard' with no <commit> resets to HEAD -- i.e.,
    no update to checkout.


Yes. It throws away any changes to the current branch. That should say

git reset --hard origin/blead


    [2017-01-27 08:11:43-0500] HEAD is now at d611579 Fix stack buffer
    overflow in deserialization of hooks.
    #####

    So why does Test-Smoke not update the branch being tested in cases
    like this?


This is an educated guess: whoever wrote that code did not understand
git well and got confused about what git pull does, and what git pull
--all do.

Seeing git pull in a script like this is a red flag, seeing  --all is a
bigger red flag for me. ( It does not "pull all", it does a fetch
against all remotes.)

IMO git pull is not really suitable for scripting as it can trigger a
rebase or merge, and trigger an editor.

I would expect to see a sequence like this:

git remote update -p
git checkout $branch
git reset --hard origin/$branch

or like this:

git remote prune --all
git fetch --all
git checkout $branch
git reset --hard origin/$branch

or even like this:

git fetch origin
git checkout $branch
git reset --hard origin/$branch

The difference between the variants being about whether the code should
be managing multiple upstream repos or not. The --all introduces
ambiguity about this, as it means "fetch code from --all remotes", so
one might guess someone wanted to support multiple upstreams. On the
other hand, my guess is that the person who coded it to do a 'git pull
--all' thought that the -all would update --all branches, which it does
not. Bolstering this view is that it seems to make little sense to smoke
branches from multiple upstreams, especially for Perl. I would have
expected only the canonical branches in the master upstream repo should
be smoked, so the --all probably was a bug.

What appears to be happening is that when the pull is executed it is in
a different branch, so it fetches and then updates *THAT* branch only
(via a merge!). When it then checks-out the new branch branch it is on
an old commit, and requires a reset to the latest code.

I would recommend that the smoke scripts do not use pull *ever*. They
should never ever modify code, so doing a pull makes no sense.  git pull
is basically a smart wrapper around git fetch + git merge. A smoker
should *NEVER* be doing git-merge, so it should *never* be using git-pull.

Note, I am fully aware that under perfect circumstances you /can/ script
this using git pull. I would recommend not to. First it is confusing.
Second, if circumstances are less than perfect then it could lead to
unwanted behavior. For instance someone tinkers in a branch used by the
smoker, then one could imaging the script breaking because of
uncommitted changes, or breaking because pull has triggered a merge
which requires a edited text message.

FWIW, i have in the past recommended that new users to git do NOT use
"git pull", until they have mastered using "git fetch" and "git rebase"
or "git merge" as independent commands. Only once having experience of
the three basic commands should people use git pull. Since it is a
wrapper around three distinct commands it easily leads to confusion in
the inexperienced.

yves

Thanks for the feedback. Pull request filed:
https://github.com/abeltje/Test-Smoke/pull/26

jimk

Reply via email to