<feed xmlns='http://www.w3.org/2005/Atom'>
<title>git/git-rebase--interactive.sh, branch v2.1.2</title>
<subtitle>Mirror of https://git.kernel.org/pub/scm/git/git.git/
</subtitle>
<id>https://git.shady.money/git/atom?h=v2.1.2</id>
<link rel='self' href='https://git.shady.money/git/atom?h=v2.1.2'/>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/'/>
<updated>2014-07-16T20:07:40Z</updated>
<entry>
<title>rebase: omit patch-identical commits with --fork-point</title>
<updated>2014-07-16T20:07:40Z</updated>
<author>
<name>John Keeping</name>
<email>john@keeping.me.uk</email>
</author>
<published>2014-07-16T19:23:49Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=1e0dacdbdb751caa5936b6d1510f5e8db4d1ed5f'/>
<id>urn:sha1:1e0dacdbdb751caa5936b6d1510f5e8db4d1ed5f</id>
<content type='text'>
When the `--fork-point` argument was added to `git rebase`, we changed
the value of $upstream to be the fork point instead of the point from
which we want to rebase.  When $orig_head..$upstream is empty this does
not change the behaviour, but when there are new changes in the upstream
we are no longer checking if any of them are patch-identical with
changes in $upstream..$orig_head.

Fix this by introducing a new variable to hold the fork point and using
this to restrict the range as an extra (negative) revision argument so
that the set of desired revisions becomes (in fork-point mode):

	git rev-list --cherry-pick --right-only \
		$upstream...$orig_head ^$fork_point

This allows us to correctly handle the scenario where we have the
following topology:

	    C --- D --- E  &lt;- dev
	   /
	  B  &lt;- master@{1}
	 /
	o --- B' --- C* --- D*  &lt;- master

where:
- B' is a fixed-up version of B that is not patch-identical with B;
- C* and D* are patch-identical to C and D respectively and conflict
  textually if applied in the wrong order;
- E depends textually on D.

The correct result of `git rebase master dev` is that B is identified as
the fork-point of dev and master, so that C, D, E are the commits that
need to be replayed onto master; but C and D are patch-identical with C*
and D* and so can be dropped, so that the end result is:

	o --- B' --- C* --- D* --- E  &lt;- dev

If the fork-point is not identified, then picking B onto a branch
containing B' results in a conflict and if the patch-identical commits
are not correctly identified then picking C onto a branch containing D
(or equivalently D*) results in a conflict.

This change allows us to handle both of these cases, where previously we
either identified the fork-point (with `--fork-point`) but not the
patch-identical commits *or* (with `--no-fork-point`) identified the
patch-identical commits but not the fact that master had been rewritten.

Reported-by: Ted Felix &lt;ted@tedfelix.com&gt;
Signed-off-by: John Keeping &lt;john@keeping.me.uk&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
<entry>
<title>Merge branch 'ep/avoid-test-a-o'</title>
<updated>2014-06-25T19:23:56Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2014-06-25T19:23:56Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=e56857246adbd3ab0ded490f300da8ef34374cbc'/>
<id>urn:sha1:e56857246adbd3ab0ded490f300da8ef34374cbc</id>
<content type='text'>
Update tests and scripts to avoid "test ... -a ...", which is often
more error-prone than "test ... &amp;&amp; test ...".

Squashed misconversion fix-up into git-submodule.sh updates.

* ep/avoid-test-a-o:
  git-submodule.sh: avoid "echo" path-like values
  git-submodule.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
  t/test-lib-functions.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
  t/t9814-git-p4-rename.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
  t/t5538-push-shallow.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
  t/t5403-post-checkout-hook.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
  t/t5000-tar-tree.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
  t/t4102-apply-rename.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
  t/t0026-eol-config.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
  t/t0025-crlf-auto.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
  t/lib-httpd.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
  git-rebase--interactive.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
  git-mergetool.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
  git-bisect.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
  contrib/examples/git-resolve.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
  contrib/examples/git-repack.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
  contrib/examples/git-merge.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
  contrib/examples/git-commit.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
  contrib/examples/git-clone.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
  check_bindir: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"
</content>
</entry>
<entry>
<title>Merge branch 'rr/rebase-autostash-fix'</title>
<updated>2014-06-16T17:06:57Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2014-06-16T17:06:57Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=4a43d4f98a1a6a472ce1e87c64cb6df0d1653d02'/>
<id>urn:sha1:4a43d4f98a1a6a472ce1e87c64cb6df0d1653d02</id>
<content type='text'>
* rr/rebase-autostash-fix:
  rebase -i: test "Nothing to do" case with autostash
  rebase -i: handle "Nothing to do" case with autostash
</content>
</entry>
<entry>
<title>git-rebase--interactive.sh: avoid "test &lt;cond&gt; -a/-o &lt;cond&gt;"</title>
<updated>2014-06-09T21:47:07Z</updated>
<author>
<name>Elia Pinto</name>
<email>gitter.spiros@gmail.com</email>
</author>
<published>2014-06-06T14:55:52Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=e425f6ad4d14d49fee09712af0aa6f56037e7dd7'/>
<id>urn:sha1:e425f6ad4d14d49fee09712af0aa6f56037e7dd7</id>
<content type='text'>
The construct is error-prone; "test" being built-in in most modern
shells, the reason to avoid "test &lt;cond&gt; &amp;&amp; test &lt;cond&gt;" spawning
one extra process by using a single "test &lt;cond&gt; -a &lt;cond&gt;" no
longer exists.

Signed-off-by: Elia Pinto &lt;gitter.spiros@gmail.com&gt;
Reviewed-by: Matthieu Moy &lt;Matthieu.Moy@imag.fr&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
<entry>
<title>rebase -i: handle "Nothing to do" case with autostash</title>
<updated>2014-05-19T22:36:24Z</updated>
<author>
<name>Ramkumar Ramachandra</name>
<email>artagnon@gmail.com</email>
</author>
<published>2014-05-19T22:05:20Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=e4244eb3957d478ca05b42d8b56aadb9ab2bc7ae'/>
<id>urn:sha1:e4244eb3957d478ca05b42d8b56aadb9ab2bc7ae</id>
<content type='text'>
When a user invokes

  $ git rebase -i @~3

with dirty files and rebase.autostash turned on, and exits the $EDITOR
with an empty buffer, the autostash fails to apply. Although the primary
focus of rr/rebase-autostash was to get the git-rebase--backend.sh
scripts to return control to git-rebase.sh, it missed this case in
git-rebase--interactive.sh. Since this case is unlike the other cases
which return control for housekeeping, assign it a special return status
and handle that return value explicitly in git-rebase.sh.

Reported-by: Karen Etheridge &lt;ether@cpan.org&gt;
Signed-off-by: Ramkumar Ramachandra &lt;artagnon@gmail.com&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
<entry>
<title>Merge branch 'km/avoid-non-function-return-in-rebase'</title>
<updated>2014-04-21T17:42:46Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2014-04-21T17:42:45Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=0b17b4331087224883878e49342037bf69717b62'/>
<id>urn:sha1:0b17b4331087224883878e49342037bf69717b62</id>
<content type='text'>
Work around /bin/sh that does not like "return" at the top-level
of a file that is dot-sourced from inside a function definition.

* km/avoid-non-function-return-in-rebase:
  Revert "rebase: fix run_specific_rebase's use of "return" on FreeBSD"
  rebase: avoid non-function use of "return" on FreeBSD
</content>
</entry>
<entry>
<title>rebase: avoid non-function use of "return" on FreeBSD</title>
<updated>2014-04-17T17:13:29Z</updated>
<author>
<name>Kyle J. McKay</name>
<email>mackyle@gmail.com</email>
</author>
<published>2014-04-11T08:28:17Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=9f50d32b9c20cc94b9882484ca9704af332a5622'/>
<id>urn:sha1:9f50d32b9c20cc94b9882484ca9704af332a5622</id>
<content type='text'>
Since a1549e10, 15d4bf2e and 01a1e646 (first appearing in v1.8.4)
the git-rebase--*.sh scripts have used a "return" to stop execution
of the dot-sourced file and return to the "dot" command that
dot-sourced it.  The /bin/sh utility on FreeBSD however behaves
poorly under some circumstances when such a "return" is executed.

In particular, if the "dot" command is contained within a function,
then when a "return" is executed by the script it runs (that is not
itself inside a function), control will return from the function
that contains the "dot" command skipping any statements that might
follow the dot command inside that function.  Commit 99855ddf (first
appearing in v1.8.4.1) addresses this by making the "dot" command
the last line in the function.

Unfortunately the FreeBSD /bin/sh may also execute some statements
in the script run by the "dot" command that appear after the
troublesome "return".  The fix in 99855ddf does not address this
problem.

For example, if you have script1.sh with these contents:

run_script2() {
        . "$(dirname -- "$0")/script2.sh"
        _e=$?
        echo only this line should show
        [ $_e -eq 5 ] || echo expected status 5 got $_e
        return 3
}
run_script2
e=$?
[ $e -eq 3 ] || { echo expected status 3 got $e; exit 1; }

And script2.sh with these contents:

if [ 5 -gt 3 ]; then
        return 5
fi
case bad in *)
        echo always shows
esac
echo should not get here
! :

When running script1.sh (e.g. '/bin/sh script1.sh' or './script1.sh'
after making it executable), the expected output from a POSIX shell
is simply the single line:

only this line should show

However, when run using FreeBSD's /bin/sh, the following output
appears instead:

should not get here
expected status 3 got 1

Not only did the lines following the "dot" command in the run_script2
function in script1.sh get skipped, but additional lines in script2.sh
following the "return" got executed -- but not all of them (e.g. the
"echo always shows" line did not run).

These issues can be avoided by not using a top-level "return" in
script2.sh.  If script2.sh is changed to this:

main() {
        if [ 5 -gt 3 ]; then
                return 5
        fi
        case bad in *)
                echo always shows
        esac
        echo should not get here
        ! :
}
main

Then it behaves the same when using FreeBSD's /bin/sh as when using
other more POSIX compliant /bin/sh implementations.

We fix the git-rebase--*.sh scripts in a similar fashion by moving
the top-level code that contains "return" statements into its own
function and then calling that as the last line in the script.

Signed-off-by: Kyle J. McKay &lt;mackyle@gmail.com&gt;
Acked-by: Matthieu Moy &lt;Matthieu.Moy@imag.fr&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
<entry>
<title>Merge branch 'us/printf-not-echo'</title>
<updated>2014-03-25T18:08:27Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2014-03-25T18:08:26Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=cf30bfb8fb9e749637a73685a8de9600ab1fbe5f'/>
<id>urn:sha1:cf30bfb8fb9e749637a73685a8de9600ab1fbe5f</id>
<content type='text'>
* us/printf-not-echo:
  test-lib.sh: do not "echo" caller-supplied strings
  rebase -i: do not "echo" random user-supplied strings
</content>
</entry>
<entry>
<title>rebase -i: do not "echo" random user-supplied strings</title>
<updated>2014-03-17T19:24:14Z</updated>
<author>
<name>Uwe Storbeck</name>
<email>uwe@ibr.ch</email>
</author>
<published>2014-03-14T23:56:43Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=47be06602656ee9cac860f675d2c8d1f0deabdbe'/>
<id>urn:sha1:47be06602656ee9cac860f675d2c8d1f0deabdbe</id>
<content type='text'>
In some places we "echo" a string that comes from a commit log
message, which may have a backslash sequence that is interpreted by
the command (POSIX.1 allows this), most notably "dash"'s built-in
'echo'.

A commit message which contains the string '\n' (or ends with the
string '\c') may result in a garbage line in the todo list of an
interactive rebase which causes the rebase to fail.

To reproduce the behavior (with dash as /bin/sh):

  mkdir test &amp;&amp; cd test &amp;&amp; git init
  echo 1 &gt;foo &amp;&amp; git add foo
  git commit -m"this commit message ends with '\n'"
  echo 2 &gt;foo &amp;&amp; git commit -a --fixup HEAD
  git rebase -i --autosquash --root

Now the editor opens with garbage in line 3 which has to be
removed or the rebase fails.

Signed-off-by: Uwe Storbeck &lt;uwe@ibr.ch&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
<entry>
<title>rebase: add the --gpg-sign option</title>
<updated>2014-02-11T22:48:20Z</updated>
<author>
<name>Nicolas Vigier</name>
<email>boklm@mars-attacks.org</email>
</author>
<published>2014-02-10T01:03:37Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=3ee5e54038fd32ee60b24ebd385981aeb14b80a5'/>
<id>urn:sha1:3ee5e54038fd32ee60b24ebd385981aeb14b80a5</id>
<content type='text'>
Signed-off-by: Nicolas Vigier &lt;boklm@mars-attacks.org&gt;
Signed-off-by: brian m. carlson &lt;sandals@crustytoothpaste.net&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
</feed>
